可锐资源网

技术资源分享平台,提供编程学习、网站建设、脚本开发教程

「系统架构」Swoole是以命令行的方式运行的,如何热更新代码?

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清理工作。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言