Swoole 的绝大部分功能只能用于 cli 命令行环境,而在 cli 命令行环境下,一旦进程启动,已解析的 PHP 代码会持久化在进程中,也就意味着启动做事后您再修正的 PHP 代码不会改变已启动的做事。
那Swoole如何更新代码?只好手动重启做事?No。
Swoole 供应了柔性终止 / 重启的机制,管理员只须要向 Server 发送特定的旗子暗记或者调用 reload 方法,事情进程就可以结束,并重新拉起。如下:

底层逻辑为:
第一步: 向manager进程发送USR1旗子暗记第二步: manager捕获到USR1旗子暗记,会向worker进程发送 TERM旗子暗记。第三步:worker进程捕获这个TERM信息,就把一个running的标识设置0第四步:woker的事宜循环创造running标识为0,处理完当前逻辑就会自尽(自尽前会回调onWorkerStop函数),第五步:manager再拉起一个新的worker (拉起后会回调onWorkerStart函数)但有几点要把稳:
首先要把稳新修正的代码必须要在 OnWorkerStart 事宜中重新载入才会生效。比如,某个类在 OnWorkerStart 之前就通过 composer 的 autoload 载入了便是不可以的。
其次 reload 还要合营这两个参数 max_wait_time 和 reload_async,设置了这两个参数之后就能实现异步安全重启。
如果没有此特性,Worker 进程收到重启旗子暗记或达到 max_request 时,会立即停滞做事,这时 Worker 进程内可能仍旧有事宜监听,这些异步任务将会被丢弃。设置上述参数后会先创建新的 Worker,旧的 Worker 在完成所有事宜之后自行退出,即 reload_async。
如果旧的 Worker 一贯不退出,底层还增加了一个定时器,在约定的韶光 ( max_wait_time 秒) 内旧的 Worker 没有退出,底层会强行终止。如下:
如果修正了hot_update_class.php里的干系文件,再实行$serv->reload(),就可以实现热更新了。
如果你利用了autoloader自动加载,那么你可以把autoloader的注册放到onWorkerStart里来。
如果你利用了框架,那么你可以把框架的入口文件放到onWorkerStart里来。
如果你开启了opcache,那么,你可以在onWorkerStop的时候,实行干系的opcache清理事情。