基于 swoole 的客服系统,现在要实现代码的热更新。请教大家可行的方法?

2019-08-27 14:35:16 +08:00
 awanganddong

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'];
5043 次点击
所在节点    PHP
7 条回复
moxiaocheng
2019-08-27 18:24:15 +08:00
仔细看文档 上面有答案
keepeye
2019-08-27 18:40:53 +08:00
客户端没有自动重连机制么?
TangMonk
2019-08-27 19:00:01 +08:00
客户端自动重连就好了
PHPJit
2019-08-28 09:26:22 +08:00
awanganddong
2019-08-28 11:59:07 +08:00
@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 这个回调函数实现的。
awanganddong
2019-08-28 12:00:59 +08:00
@PHPJit 我先看看你给我代码的思路

以上,客户端重连功能我现在还没开始研究。。。。。
awanganddong
2019-08-29 10:09:21 +08:00
继续备注下,客户端重连功能,大概是这样操作的。
就是一个定时器每次向后端发 ping ,然后这个定时器里边会再次包含一个定时器,时间可以延后一段,然后如果第一个定时器失败,则第二个定时器启动 send。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/595533

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX