上次我们说到js定时异步请求模仿实时通讯。
本次我们就来讲下另一种即时通讯,workerman+tp6
环境:tp6(5也可以),workerman插件,composer,apipost(接口测试软件)
首先执行以下代码安装workerman
composer require topthink/think-worker`
安装好之后
在项目路径下的cofing 文件下找到 config/worker_server.php
'protocol' => 'websocket', // 协议 支持 tcp udp unix http websocket text
'host' => '0.0.0.0', // 监听地址
'port' => 2346, // 监听端口
'socket' => '', // 完整监听地址
'context' => [], // socket 上下文选项
'worker_class' => 'app\man\Worker', // 自定义Workerman服务类名 支持数组定义多个服务
只需要修改里面对应的参数即可,‘worker_class’可以是多个,需要使用逗号分隔开,也可以写成数组,路径需要写我们的类的绝对路径,不需要带后缀。
worker类代码如下
where('order_status',0)->where('is_push',0)->order('id desc')->count('id');
// $system_listener = Db::name('system_listener')->cache(true)->order('id desc')->select()->toArray();
if($hasNewDepositOrder){
$depositOrderInfo = Db::name('deposit_order')->where('order_status',0)->where('is_push',0)->order('id desc')->find();
// $data = ['creatTime'=>$depositOrderInfo['create_time'],'money'=>$depositOrderInfo['pay_amount'],'type'=>'deposit','system_listener'=>$system_listener];
$data = ['creatTime'=>$depositOrderInfo['create_time'],'money'=>$depositOrderInfo['pay_amount'],'type'=>'deposit'];
foreach($worker->connections as $connection) {
if(empty($connection->lastMessageTime)){
$connection->lastMessageTime = $time_now;
}
if($time_now-$connection->lastMessageTime > self::$heartbeat_time){
$connection->close();
}
$connection->send(json_encode($data));
}
Db::name('deposit_order')->where('id',$depositOrderInfo['id'])->save(['is_push'=>1]);
}else{
foreach($worker->connections as $connection) {
if(empty($connection->lastMessageTime)){
$connection->lastMessageTime = $time_now;
continue;
}
if($time_now-$connection->lastMessageTime > self::$heartbeat_time){ //连接超时
$connection->close();
}
}
}
});
}
}
头部引入我们必须的几个类,定义好命名空间
下面的成员变量配置我们的端口以及心跳时间,函数内就是封装我们的自己的逻辑。
重新启动wokkerman
php think worker:server start 开启
php think worker:server stop 结束
php think worker:server status 查看状态
然后随便进入一个页面,这里需要注意的是在tp6中需要引入view类,否则有可能报错找不到
use think\facade\View;
将view删除,运行
composer require topthink/think-view
再新建view文件夹,还需要开启777权限,这是博主遇到的真实问题。
页面建好后,我们页面内写
Title
因为上面是根据数据库的信息插入来进行判断了 所以我们通过结构去表中增加数据在前台的 onmessage 中就可以打印出来数据展示
直接通过数据库的新增数据,就可以把对应的信息展示出来 具体逻辑就是worker.php中写的数据库展示逻辑
然后到根目录启动workerman,看下具体的效果。
php think worker:server 启动
然后看到ok了,再见。