GatewayWorker
GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等
用GatewayWorker还是Workerman
1、如果你的项目是长连接并且需要客户端与客户端之间通讯,建议使用GatewayWorker。
2、短连接或者不需要客户端与客户端之间通讯的项目建议使用Workerman。
3、GatewayWorker不支持UDP监听,所以UDP服务请选择Workerman。
如果你是一个有多进程socket编程经验的人,喜欢定制自己的进程模型,可以选择Workerman。
同步异步以及阻塞和非阻塞的区别
1、同步阻塞:小明啥都不干等奶茶。
2、同步非阻塞:小明一边玩手机一边等奶茶。
3、异步阻塞:小明拿着小票啥都不干等着奶茶妹告诉他奶茶好了
4、异步非阻塞:小明拿着小票玩着手机等着奶茶妹告诉他奶茶好了
业务需求示例:系统后台监听有新的商品订单,新消息等的通知,推送给所有登陆系统的用户。
安装workerman组件
composer require topthink/think-worker=2.0.8
配置 config/worker_server.php
'protocol' => 'websocket', // 协议 支持 tcp udp unix http websocket text
'host' => '0.0.0.0', // 监听地址
'port' => 2345, // 监听端口
'socket' => '', // 完整监听地址
'context' => [], // socket 上下文选项
'worker_class' => 'app\index\controller\Worker', // 自定义Workerman服务类名 支持数组定义多个服务
实现 app\index\controller\Worker.php
<?php
namespace app\index\controller;
use think\worker\Server;
use Workerman\Lib\Timer;
/**
* websockect
* Class Worker
* @package app\http
*/
class Worker extends Server
{
protected $socket = 'http://0.0.0.0:1111';
/**
* 心跳检测
* @var int
*/
protected static $heartbeat_time = 55;
## 接收消息,接收心跳消息 ,接收用户id 信息等等
public function onMessage($connection,$data)
{
$connection->lastMessageTime = time();
var_dump($data);
$connection->send('receive success');
}
/**
* 消息回调
* @param $worker
* @author 冬
* @date 2022/5/5 17:07
*/
public function onWorkerStart($worker)
{
//查看是否有新的下面的3是几秒推送一次
Timer::add(3, function () use ($worker) {
$time_now = time();
var_dump(date('Y-m-d H:i:s',$time_now) );
## 推送的数据
$infoArr = '推送的数据';
// $infoArr = json_decode(json_encode($infoObj),true);
if (true) {
foreach ($worker->connections as $connection) {
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
}
var_dump(date('Y-m-d H:i:s',$connection->lastMessageTime) );
if ($time_now - $connection->lastMessageTime > self::$heartbeat_time) {
$connection->close();
}
$connection->send(json_encode($infoArr));
}
} else {
var_dump(22);
foreach ($worker->connections as $connection) {
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
if ($time_now - $connection->lastMessageTime > self::$heartbeat_time) { //连接超时
$connection->close();
}
}
}
});
}
}
实现 websokcet
<script>
let ws = new WebSocket("ws://192.168.118.133:1111")
ws.onopen = function() { //绑定连接事件
console.log("连接成功");
//每30秒发送一次心跳,保持连接
setInterval(function(){
ws.send('123');
console.log('发送心跳...');
},30000)
};
ws.onmessage = function (s){
console.log(s.data);
}
ws.onclose = function(evt) { //绑定关闭或断开连接事件
console.log("连接已关闭");
};
</script>
操作
//支持reload|restart|stop|status 操作
//-d 守护进程
php think worker:server -d