V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
awanganddong
V2EX  ›  PHP

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

  •  
  •   awanganddong · 2019-08-27 14:35:16 +08:00 · 5027 次点击
    这是一个创建于 1675 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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'];
    
    7 条回复    2019-08-29 10:09:21 +08:00
    moxiaocheng
        1
    moxiaocheng  
       2019-08-27 18:24:15 +08:00
    仔细看文档 上面有答案
    keepeye
        2
    keepeye  
       2019-08-27 18:40:53 +08:00
    客户端没有自动重连机制么?
    TangMonk
        3
    TangMonk  
       2019-08-27 19:00:01 +08:00
    客户端自动重连就好了
    awanganddong
        5
    awanganddong  
    OP
       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
        6
    awanganddong  
    OP
       2019-08-28 12:00:59 +08:00
    @PHPJit 我先看看你给我代码的思路

    以上,客户端重连功能我现在还没开始研究。。。。。
    awanganddong
        7
    awanganddong  
    OP
       2019-08-29 10:09:21 +08:00
    继续备注下,客户端重连功能,大概是这样操作的。
    就是一个定时器每次向后端发 ping ,然后这个定时器里边会再次包含一个定时器,时间可以延后一段,然后如果第一个定时器失败,则第二个定时器启动 send。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   980 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:10 · PVG 04:10 · LAX 13:10 · JFK 16:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.