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

9eead314fd8523b75148fbb29c75f4f2.png

Swoole 的绝大部分功能只能用于 cli 命令行环境,而在 cli 命令行环境下,一旦进程启动,已解析的 PHP 代码会持久化在进程中,也就意味着启动服务后您再修改的 PHP 代码不会改变已启动的服务。

那Swoole如何更新代码?只能手动重启服务?No。

Swoole 提供了柔性终止 / 重启的机制,管理员只需要向 Server 发送特定的信号或者调用 reload 方法,工作进程就可以结束,并重新拉起。如下:

ad682909b926da13668c303def4d5fb2.png

底层逻辑为:

  • 第一步: 向manager进程发送USR1信号
  • 第二步: manager捕获到USR1信号,会向worker进程发送 TERM信号。
  • 第三步:worker进程捕获这个TERM信息,就把一个running的标识设置0
  • 第四步:woker的事件循环发现running标识为0,处理完当前逻辑就会自杀(自杀前会回调onWorkerStop函数),
  • 第五步:manager再拉起一个新的worker (拉起后会回调onWorkerStart函数)

但有几点要注意:

首先要注意新修改的代码必须要在 OnWorkerStart 事件中重新载入才会生效。比如,某个类在 OnWorkerStart 之前就通过 composer 的 autoload 载入了就是不可以的。

083f9ced4f8041059c3edb12f4674abd.png

其次 reload 还要配合这两个参数 max_wait_time 和 reload_async,设置了这两个参数之后就能实现异步安全重启。

如果没有此特性,Worker 进程收到重启信号或达到 max_request 时,会立即停止服务,这时 Worker 进程内可能仍然有事件监听,这些异步任务将会被丢弃。设置上述参数后会先创建新的 Worker,旧的 Worker 在完成所有事件之后自行退出,即 reload_async。

如果旧的 Worker 一直不退出,底层还增加了一个定时器,在约定的时间 ( max_wait_time 秒) 内旧的 Worker 没有退出,底层会强行终止。如下:

7ab8fdad68c56114164b72428258ebda.png

如果修改了hot_update_class.php里的相关文件,再执行$serv->reload(),就可以实现热更新了。

如果你使用了autoloader自动加载,那么你可以把autoloader的注册放到onWorkerStart里来。

如果你使用了框架,那么你可以把框架的入口文件放到onWorkerStart里来。

如果你开启了opcache,那么,你可以在onWorkerStop的时候,执行相关的opcache清理工作。

4e850ad3d210e07c6d68cd83aeab1abd.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值