workermanDay03 workerman 与TP5 框架整合,web消息推送demo

目录

0x00 workerman 与其他框架整合

0x01 TP5.0 安装 workerman

0x02 TP5.1整合workerman

0x03 WEB消息推送


0x00 workerman 与其他框架整合

workermanDay03 workerman 与TP5 框架整合,web消息推送demo_第1张图片

与其它mvc框架结合建议以上图的方式(ThinkPHP为例):

1、ThinkPHP与Workerman是两个独立的系统,独立部署(可部署在不同服务器),互不干扰。

2、ThinkPHP以HTTP协议提供网页页面在浏览器渲染展示。

3、ThinkPHP提供的页面的js发起websocket连接,连接workerman

4、连接后给Workerman发送一个数据包(包含用户名密码或者某种token串)用于验证websocket连接属于哪个用户。

5、仅在ThinkPHP需要向浏览器推送数据时,才调用workerman的socket接口推送数据。

6、其余请求还是按照原本ThinkPHP的HTTP方式调用处理。

总结:

把Workerman作为一个可以向浏览器推送的通道,仅仅在需要向浏览器推送数据时才调用Workerman接口完成推送。业务逻辑全部在ThinkPHP中完成。

ThinkPHP如何调用Workerman socket接口推送数据参考见常见问题-在其它项目中推送一节

0x01 TP5.0 安装 workerman

workermanDay03 workerman 与TP5 框架整合,web消息推送demo_第2张图片

composer require topthink/think-worker=1.0.*

server.php

#!/usr/bin/env php

在application下创建一个push模块 application/push/controller/Worker.php

send('我收到你的信息了');
    }

    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {

    }

    /**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
    public function onClose($connection)
    {
        
    }

    /**
     * 当客户端的连接上发生错误时触发
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection, $code, $msg)
    {
        echo "error $code $msg\n";
    }

    /**
     * 每个进程启动
     * @param $worker
     */
    public function onWorkerStart($worker)
    {

    }
}

启动server.php即可

php server.php start

0x02 TP5.1整合workerman

workermanDay03 workerman 与TP5 框架整合,web消息推送demo_第3张图片

安装:composer require topthink/think-worker=2.0.*

安装成功后就可以直接用

php think worker:server

php think worker:server -d 守护进程

来启动了。

 

至于具体用什么协议,监听什么端口等都可以通过修改config下worker_server.php 来实现。

如果业务逻辑比较简单,可以直接在worker_server.php中写,

如果业务逻辑比较多,建议在类中实现,然后在worker_class 中添加上这些类

workermanDay03 workerman 与TP5 框架整合,web消息推送demo_第4张图片

注意:以命名空间的格式添加,自定义workerman 服务类之后,配置文件中之前

配置的监听端口,监听ip,协议这些东西都会被wokerman服务类中的配置所覆盖

workermanDay03 workerman 与TP5 框架整合,web消息推送demo_第5张图片

自定义Worker.php类来继承Server类

'123',
            'count'=>3
        ];
	public function onWorkerStart($worker){
		echo "worker start";
	}
	public function onConnect(){
		echo "connect success";
	}
	public function onMessage($connection,$data){
		$connection->send($data);
	}
}

0x03 WEB消息推送

workermanDay03 workerman 与TP5 框架整合,web消息推送demo_第6张图片

安装channel组件

composer require workerman/channel

worker_server中配置自定义类

workermanDay03 workerman 与TP5 框架整合,web消息推送demo_第7张图片

On.php

'On'
    ];
    public function onWorkerStart($worker){
        Client::connect('127.0.0.1',8883);
        //单个用户订阅事件
        Client::on($worker->id,function($data)use($worker){
            //$data = ['connection_id'=>2,'content'=>'Hello World']
            //找到用户对应的连接
            $connection = $worker->connections[$data['connection_id']];
            //向该用户发送数据
            $connection->send($data['content']);
        });
        //所有网站链接用户的订阅事件
        Client::on('broadcast',function($data)use($worker){
            //$data = [content'=>'Hello World'] 
            foreach($worker->connections as $conn){
                $conn->send($data['content']);
            }
        });
    }
    public function onConnect($connection){
        $connection->send("套接字连接成功");
        $connection->send('connection_id='.$connection->id.'  worker_id='.$this->worker->id);
    }

}

new Channel_Server('0.0.0.0',8883);

Publish.php

'publish'
    ];
    public function onWorkerStart($worker){
        Client::connect('127.0.0.1',8883);

    }
    public function onMessage($connection,$data){
        $connection->send('ok');
        //101.200.142.148:8884?content=hello&connection_id=2&worker_id=0单个用户发布
        if(!isset($_GET['content'])){
            return;
        }
        if(isset($_GET['worker_id'])&&isset($_GET['connection_id'])){
            //发布单个用户订阅事件
            $data = [
                'connection_id'=>$_GET['connection_id'],
                'content'=>$_GET['content']
            ];
            Client::publish($_GET['worker_id'],$data);
        }else{
            $data = ['content'=>$_GET['content']];
            //发布群发事件
            Client::publish('broadcast',$data);
        }


    }

}

 

你可能感兴趣的:(计算机网络,PHP)