workerman reload问题的疑惑

void

workerman版本:3.5.18

发起 reload 指令

前置条件
static::$_gracefulStop = true;
$worker->reloadable = true;
$worker->count = 4;

[attach]1698[/attach]

[attach]1699[/attach]
 
按照这个逻辑一次只能 reload 一个子进程,其他3个子进程根本reload不了
是否需要手动执行多次reload 才能reload其余的子进程呢,有点不解, THX

2753 1 0
1个回答

blogdaren
  1. reload的原理就是一个一个逐步退出然后逐步启动的,这个启动的过程是自动的,非手动的。
  2. 其原理的另外部分相关代码位于:
    https://github.com/walkor/Workerman/blob/9f36bb4cb718c6fd5b03771bd5f266cd371bb23e/Worker.php#L1592-L1600
  • void 2019-01-31

    parseCommand 方法里面有 reload指令的解析,还有 -g 参数 ,这个是可以手动的,如果是
    手动,按照代码逻辑一次只能 reload 一个子进程

  • void 2019-01-31

    $one_worker_pid = current(static::$_pidsToRestart);
    // Send reload signal to a worker process.
    posix_kill($one_worker_pid, $sig);

    在主进程 reload 方法里只向一个子进程发送了 reload 信号,手动操作带 -g 参数进行 reload
    这个是不能实现对所有子进程进行 reload吧,不知道理解对不对, THX

  • blogdaren 2019-01-31
    1. 我说的非手动是指:执行php start.php reload [-g] 指令后,逐个reload 子进程的启动过程是由主进程自动启动的。
    2. php start.php reload: 代表平滑重启进程,所谓的一个一个逐步退出然后逐步启动,换句话就是: 第一个子进程退出,然后主进程立即补上来一个,然后第二个子进程再退出,然后再补上来一个......一次类推,直至新的进程完全替换掉老的进程。
    3. php start.php reload -g: 代表的优雅的重启,唯一的区别就在于每个子进程会等待连接关闭以后才会退出,剩余的 和 reload 一模一样。
  • void 2019-01-31

    谢谢兄台的细心解答,我再分析一下全局代码,可能是某个点被我忽略了,造成理解上的疑惑

  • blogdaren 2019-01-31

    @5401:

    1. -g 参数和你说的能否reload 所有子进程,根本毫无关系,我上面已经回复你了。
    2. 你贴的这段代码就是只向一个子进程发送reload信号,这正是reload的本意啊;主进程会不停的监控子进程退出情况,一旦退出然后随即给补上来,整个过程就是一个个逐步退出并逐步补上来的,重点就是:一个一个一个的来的。
    3. 不客气,你再琢磨琢磨。
  • void 2019-01-31

    好的,我再折腾一下,把所有不解的梳理出来,让兄台指点一下

年代过于久远,无法发表回答
🔝