swoole 是 master 进程负责接受请求及监控(下边有多个多线程),然后 manager 进程下有多个 worker 进程和 task 进程。
文档给的办法是用 usr1 master pid,然后会重启所有的 worker 和 task 进程,然后回调 worker 的 workerstart 闭包,相关逻辑就是在这个闭包处理。但是,我的相关逻辑代码是写在 onmessage 中,然后用文档给的办法无效
$server->on('WorkerStart', function (){
//官方给的说明,在这里 require_once 业务文件
cli_set_process_title("swoole_worker");
});
$server->on('start', function () {
cli_set_process_title("swoole_master");
});
$server->on('open', function (\Swoole\WebSocket\Server $server, $request) {
// $server->push($request->fd,json_encode([
// 'code'=>200,
// 'type'=>'bind',
// 'msg'=>'success'
// ]) );
});
$server->on('message', function (\Swoole\WebSocket\Server $server, $frame) {
//我的相关业务逻辑在这里
$db=self::$db;
$redis=self::$redis;
$data=json_decode($frame->data,true);
$type=$data['type'];
1
moxiaocheng 2019-08-27 18:24:15 +08:00
仔细看文档 上面有答案
|
2
keepeye 2019-08-27 18:40:53 +08:00
客户端没有自动重连机制么?
|
3
TangMonk 2019-08-27 19:00:01 +08:00
客户端自动重连就好了
|
4
PHPJit 2019-08-28 09:26:22 +08:00
|
5
awanganddong OP @all 谢谢诸位
引用风大的话: ----------------------------------------------------- 打个最简单的比方,, 比如说你的业务处理代码是 App\xxx.php 然后你在 onMessage 里面要用的时候,要么是要 include 一下,要么是 require 一下,假如都没有,就是你用了某种自动加载类,以保证 onMessage 的时候这个类是系统知道的。 这个文件,swoole 是常驻内存,就是说,你在服务启动的时候把相关依赖一次读到内存里面或者是在第一次执行它的时候读到内存里面。 一旦一个 php 文件读到内存以后,就会保留到内存里面了。后面你再改文件,实际上内存里面的数据是不变的。 你要想做到热更新,只能是在每个进程启动的时候把相关的文件读一次。 ----------------------------------------------------- 参考文件: https://blog.csdn.net/zhouzme/article/details/69388826 https://wiki.swoole.com/wiki/page/20.html ---------------------------------------------------- 总结:也就是说 swoole manager 进程在重启 worker 进程的过程中,因为内存是常驻的,所以现在要做的第一件是通过 require 或者 include 把相关配置文件或者业务文件加载进内存。然后在下边的 onmessage 中执行改动的文件。 而加载文件是通过 onworkerstart 这个回调函数实现的。 |
6
awanganddong OP |
7
awanganddong OP 继续备注下,客户端重连功能,大概是这样操作的。
就是一个定时器每次向后端发 ping ,然后这个定时器里边会再次包含一个定时器,时间可以延后一段,然后如果第一个定时器失败,则第二个定时器启动 send。 |