目录
0x00 workerman 与其他框架整合
0x01 TP5.0 安装 workerman
0x02 TP5.1整合workerman
0x03 WEB消息推送
与其它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接口推送数据参考见常见问题-在其它项目中推送一节
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
安装: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 中添加上这些类
注意:以命名空间的格式添加,自定义workerman 服务类之后,配置文件中之前
配置的监听端口,监听ip,协议这些东西都会被wokerman服务类中的配置所覆盖
自定义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);
}
}
安装channel组件
composer require workerman/channel
worker_server中配置自定义类
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);
}
}
}