swoole服务的重启方式

关于swoole服务的重启方式

一、程序内的自重启
1、$server->reload
安全地重启所有Worker/Task进程,确保正在执行的任务执行完成后才重启,master/manager进程不会停止。

bool Server->reload(bool $only_reload_taskworkrer = false)
    $only_reload_taskworkrer 是否仅重启Task进程。
    reload有保护机制,当一次reload正在进行时,收到新的重启信号会丢弃。
    如果设置了user/group,Worker进程可能没有权限向Master进程发送信息,这种情况下必须使用root账户,在shell中执行kill指令进行重启
    reload指令对addProcess添加的用户进程无效。

注意:平滑重启只对 onWorkerStart 或 onReceive 等在 Worker 进程中 include / require 的PHP文件有效,Server启动前就已经 include / require 的PHP文件,不能通过平滑重启重新加载。
对于Server的配置即$serv->set()中传入的参数设置,必须关闭/重启整个Server才可以重新加载。这就要求你能判断出,你修改的文件是在哪里被引入的,task / worker / master。

2、$server->stop()
停止Worker进程。默认是停止当前Worker进程。

3、$server->shutdown()
关闭服务器。
可在Worker进程内调用来关闭服务器,如果Worker进程内发生致命错误或者逻辑错误时可这样做。

客户端的连接是否会保持,取决于服务的运行模式:
SWOOLE_PROCESS:来自客户端的连接是由master进程管理,worker进程的重启和异常退出,不会影响连接本身。
SWOOLE_BASE:客户端连接直接维持在Worker进程中,因此reload时会切断所有连接。并且Base模式不支持reload Task进程。

二、外部重启程序
1、Server可以监听一个内网端口,然后可以接收远程的控制命令。

2、向进程发送指令。
比如,./server stop | restart | reload | status 等。一般我们在更新代码后需要restart/reload。
实现方式是,在启动服务后,将master和manager进程id保存到文件pid_file。然后使用
\Swoole\Process::kill($pid, $signo = SIGTERM) 方法来向master / manager进程发送信号。

信号:

0:可以检测进程是否存在,不会发送信号。
SIGTERM: 向主进程/管理进程发送此信号服务器将安全终止。
SIGUSR1: 向主进程/管理进程发送SIGUSR1信号,将平稳地重启所有Worker进程。
SIGUSR2: 向主进程/管理进程发送SIGUSR2信号,将平稳地重启所有Task进程。
SIGKILL:强制杀死进程,类似于 kill -9 xxx 。适用于 强制停止/强制重启 服务。
status
    1、判断 pid_file 中是否保存了masterPid, managerPid。
    2、然后判断managerPid是否存在,\Swoole\Process::kill(managerPid, 0)。
    因为manager进程存在,则master进程也存在。

stop
    1、先判断status。
    2、如果是强制关闭服务,使用kill -9 masterPid 或者 \Swoole\Process::kill(masterPid, SIGKILL)3、如果是平滑关闭服务:\Swoole\Process::kill(masterPid, SIGTERM); 
    此种方式会等待任务处理完才关闭服务,因此需要while循环来判断masterPid是否
    存在 \Swoole\Process::kill(masterPid, 0) 直到master进程不存在才说明停止成功了。
    4、然后删除pid_file文件。

reload平滑重启
    先判断status。
    向managerPid发送 SIGUSR1 指令:\Swoole\Process::kill(managerPid, SIGUSR1)。

restart重启
    先判断status。
    调用stop指令。
    调用start指令。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章