Server->reload
安全地重启所有Worker/Task
进程。例如:一台繁忙的后端服务器随时都在处理请求,如果管理员通过kill
进程方式来终止/重启服务器程序,可能导致刚好代码执行到一半终止。这种情况下会产生数据的不一致。如交易系统中,支付逻辑的下一段是发货,假设在支付逻辑之后进程被终止了。会导致用户支付了货币,但并没有发货,后果非常严重。
底层提供了柔性终止/重启的机制,Server
的Worker
和Task
进程可以安全的重启和终止。
函数原型
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
才可以重新加载
Server
可以监听一个内网端口,然后可以接收远程的控制命令,去重启所有Worker
进程
发送信号
SIGTERM
: 向主进程/管理进程发送此信号服务器将安全终止- 在
PHP
代码中可以调用$serv->shutdown()
完成此操作 SIGUSR1
: 向主进程/管理进程发送SIGUSR1
信号,将平稳地重启所有Worker
进程SIGUSR2
: 向主进程/管理进程发送SIGUSR2
信号,将平稳地重启所有Task
进程
#重启所有进程
kill -USR1 主进程PID
#仅重启task进程
kill -USR2 主进程PID
Process 模式
在Process
模式下,来自客户端的TCP
连接是在Master
进程内维持的,worker
进程的重启和异常退出,不会影响连接本身。
Base 模式
在Base
模式下,客户端连接直接维持在Worker
进程中,因此reload
时会切断所有连接。
Base
模式不支持reload
Task
进程
Reload有效范围
Reload
操作只能重新载入Worker
进程启动后加载的PHP
文件,建议使用get_included_files
函数来列出哪些文件是在WorkerStart
之前就加载的PHP
文件,在此列表中的PHP
文件,即使进行了reload
操作也无法重新载入。比如要关闭服务器重新启动才能生效。
$serv->on('WorkerStart', function($serv, $workerId) {
var_dump(get_included_files()); //此数组中的文件表示进程启动前就加载了,所以无法reload
});
APC/OpCache
如果PHP
开启了APC/OpCache
,reload
重载入时会受到影响,有2
种解决方案
- 打开
APC/OpCache
的stat
检测,如果发现文件更新APC/OpCache
会自动更新OpCode
- 在
onWorkerStart
中执行apc_clear_cache
或opcache_reset
刷新OpCode
缓存