文档章节

SWOOLE之代码热更新实现_持续的思考

xueyi28
 xueyi28
发布于 2016/05/22 15:57
字数 1234
阅读 72
收藏 0

本人参与的swoole项目有幸被很多朋友使用,我也大力向周边的一些朋友推荐,随着swoole的版本迭代更新,已经足够稳定了,在阿里,腾讯,yy等各大公司都有着使用,也有很多游戏圈里的朋友也在使用,这些朋友经常会提到一个问题,每次代码更新还需要停止服务,然后重新启动,来达到更新代码,然而这种做法,是比较粗暴的。其实swoole里提供reload的特性,完全支持代码的热更新。

在介绍swoolereload之前,先简要的讲讲web方式是如何改了文件就立即生效的:

几个概念:
1
sapi:可以简单的理解为php引擎对外的一个统一接口,使得php可以和外部程序进行交互
2
php的生命周期中关键四个调用:MINT -> RINT -> RSHUTDOWN ->MSHUTDOWN

3)  fpm : fastcgi进程管理器

那么fpm方式的流程就是: fpm通过sapi接口与php进程交互,
fpm启动的时候,
第一步:会调用各扩展的MINT方法,进行一些数据初始化(长驻内存),
第二步:每个请求过来,先会执行RINT对单个请求行一个初始化,
第三步:执行php脚本,
第四步:执行RSHUTDOWN方法,
第五步:如果你要停止fpm了,才会执行MSHUTDOWN

fpm对每个请求的处理都是一直在在重复执行 2~4

在第三步中, php的脚本是动态执行的,由于每次都要执行一次php脚本,而每次php脚本都要有一个把php文件翻译成opcode的流程(比较耗时), 于是就产生的opcache工具。

opcache:  直接把php翻译后的opcode代码树保存到共享内存中,以便直接使用,从而减少每次都把php翻译成opcode的开销。

opcache的问题:按照他的描述,修改了php文件,并不能立即被更新,

opcache的解决方案:有一个配置来设置隔多长时间检测文件是否更新了,从而有机会在第二步重新来reload相关的文件.

当然,你也可以直接reload fpm,从而达到php热更新的效果(opcache扩展可以在第四步把相关的opcode cache给清空)

swoole的问题:

swoole是以cli运行的,然后长驻内存的。整个生命周期只有在启动的时间可以一次执行RINT过程,之后所有的请求都在第三步以内完成。(这也是swoole更快的原因之一),这样的话,相关的php脚本如果被执行了一次,就永久性的长驻内存了,更新代码就没有效果了。

swoole的解决方案:内置方法 $serv->reload()

前提:swoole是一个三层架构: master->manager->worker mastermanager是启动之后,就长驻内存的,所以这里reload的是worker进程,(而我们的业务逻辑正好都在worker进程)。

简单原理:调用$server->reload()的时候:

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

从这个流程中我们会发现,onWorkerStart onWorkerStop非常像 sapi里的 RINT, RSHUTDOWN.

所以到了这里,实现代码热更新的的方案就是:

把业务逻辑的脚本文件的载入放到onWorkerStart方法里,如果用了opcache,那么把一些opcache的清理逻辑放到onWorkerStop方法里。

示例:

 functiononWorkerStart($serv,$worker_id) {

include”hot_update_class.php”;

$class=newHotUpdate();

}

 

function onWorkerStop($serv,$worker_id) {

opcache_reset();//zend_opcacheopcache清理函数

}

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

ps: 所以,我们可以把onWorkerStart当成我的业务逻辑的入口。


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

如果你开启了opcache,那么,你可以在onWorkerStop的时候,执行相关的opcache清理工作。
zend_opcache,直接调用opcache_reset()方法即可)

示例:

 functiononWorkerStop($serv,$worker_id) {

opcache_reset();//zend_opcache

//apc, xcache, eacc等其他方式,请调用相关函数

}

 

最后希望这篇博客能给你带来一些帮助。(注:如果你的worker里挂了异步事件,比如把某个curl挂到swoole_event_add里,那么workerreload会把这些都清理掉,可能导致一些逻辑错误,解决方案正在酝酿中)

本文转载自:http://blog.csdn.net/kangqi7000/article/details/51475421

共有 人打赏支持
xueyi28
粉丝 7
博文 93
码字总数 33978
作品 0
南宁
私信 提问
imi v0.2.2 发布,1秒增量热更新 + 60余项改进

距离上次发布差不多一个月了,这期间 imi 稳步推进,修复各项问题的同时,增加了不少实用组件和注解。 此次更新,在开发项目的体验也有巨大的提升。imi 的热更新采用了最新的增量更新技术,原...

宇润
12/11
0
0
imi v0.0.9 支持 Swoole 4.1.0 一键协程化,40 余项改进

v0.0.9 更新内容: 新增: 适配支持 Swoole 4.1.0 一键协程化 新增进程池支持 新增模型生成时,如目录不存在则自动创建 新增ProcessManager::runWithManager方法,可以在IMI.SERVERS.CREATE....

宇润
08/24
607
0
php-msf 源码解读

date: 2017-12-22 11:29:15 title: php-msf 源码解读 php-msf: https://github.com/pinguo/php-msf 百度脑图 - php-msf 源码解读: http://naotu.baidu.com/file/cc7b5a49dfed46001d22222b1af......

daydaygo
2017/12/24
0
0
swoole 在 swoft 中的应用

date: 2017-12-14 21:34:51 title: swoole 在 swoft 中的应用 swoft 官网: https://www.swoft.org/ swoft 源码解读: http://naotu.baidu.com/file/814e81c9781b733e04218ac7a0494e2a?token=......

daydaygo
2017/12/18
0
0
Swoole 自定义项目初始化事件处理的实现

最近使用基于 Swoole 开发的 imi 框架 开发项目,碰到一个需求,就是想要做项目初始化处理。当初始化处理完成前,不想让 Swoole 处理请求。因为可能有一些值没有加载进来,处理请求极有可能出...

宇润
09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
50分钟前
9
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
9
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部