swoole官网:https://wiki.swoole.com
应用场景:
主服务器用于和客户端(websocket)信息通信----增加了端口监听
从服务器用于接收设备端mqtt信息回传
开启主服务器进程后,在项目中操作中,mqtt服务器中的参数等信息,需要和主服务器进程通信然后才能把数据发送给用户;
主体思路:在主服务器里新增监听端口,监听所有给这个端口发送的信息;
一、搭建主服务器:
//连接配置 可以按照服务器情况进行设置
const WS_CONFIG_PARAMS = [
'reactor_num' => 2, //设置启动的 Reactor 线程数,建议设置为 CPU 核数的 1-4 倍
'worker_num' => 4, //设置启动的 Worker 进程数
'max_request' => 1000, //设置 worker 进程的最大任务数
'max_connection' => 1000, //服务器程序,最大允许的连接数。最大允许维持多少个 TCP 连接
'dispatch_mode' => 2, // 数据包分发策略
'daemonize' => 1, //守护进程化 1为转入后台作为守护进程运行
'task_worker_num' => 0,//开启的task进程数
'heartbeat_check_interval' => 10,//启用心跳检测,此选项表示每隔多久轮循一次,单位为秒
'heartbeat_idle_time' => 60*60,//连接最大允许空闲的时间
'log_file' => '/home/log/swoole/SiteWebsoketswoole.log',
'log_level' => 1,
'open_tcp_keepalive' => 1,
'tcp_keepidle' => 30, //单位秒,连接在 n 秒内没有数据请求,将开始对此连接进行探测。
'tcp_keepcount' => 3, //探测的次数,超过次数后将 close 此连接。
'tcp_keepinterval' => 3, //探测的间隔时间,单位秒。
// 'user' => 'work', //设置 Worker/TaskWorker 子进程的所属用户
// 'group' => 'work', //设置 Worker/TaskWorker 子进程的进程用户组。
// 'pid_file' => '/tmp/pid/websocket.pid', //设置 pid 文件地址。
'reload_async' => true, //设置异步重启开关
'tcp_fastopen' => true, //开启 TCP 快速握手特性
'max_coroutine' => 5000, //设置当前工作进程最大协程数量
];
搭建websocket服务器连接
$server = new \swoole_websocket_server(127.0.0.1,9511);
//配置swoole启动设置
$server->set(self::WS_CONFIG_PARAMS);
//配置监听端口 这里我进行了端口监听用于进程之间的消息互发
$this->serverMonitor($server);
//监听WebSocket连接打开事件
$server->on('open', function ($server, $request) {
echo 'open';
// $this->onOpen($server, $request);
});
//监听WebSocket消息事件
$server->on('message', function ($server, $frame){
$this->onMessage($server,$frame->fd,JsonD($frame->data));
});
//监听WebSocket关闭消息事件
$server->on('close', function ($server, $fd) {
echo 'close';
// $this->onClose($server, $fd);
});
$server->start();
设置监听端口设置:监听给9512发送的信息
/**
* 多监听一个TCP端口,对外开启TCP服务,并设置TCP服务器的回调
* @return [type] [description]
*/
function serverMonitor($server)
{
$serverData = $server->listen(127.0.0.1, 9512, SWOOLE_SOCK_TCP);
//需要调用 set 方法覆盖主服务器的设置
$serverData->set([]);
$serverData->on('receive', function ($server, $fd, $threadId, $data) {
if(!$data) return true;
$data = JsonD($data);
//推送消息
$this->sendwebSite($data['topic'],$data['msg'],$server);
});
}
二、与主进程服务器进行连接: 通信端口为9512
设置连接参数:SWOOLE_KEEP中创建一个 TCP 长连接到服务器端
$clientSite = new \Swoole\Client(SWOOLE_SOCK_TCP | SWOOLE_KEEP);
if (!$clientSite->connect(127.0.0.1, 9512, 2)) {
Log::error($e->getMessage() . ':' . $e->getFile());
return false;
}
这样,进程之间可以进行通信;