swoole之代码热更新实现

From: http://www.th7.cn/Program/php/201405/211057.shtml

持续的思考:

 本人参与的swoole项目有幸被很多朋友使用,我也大力向周边的一些朋友推荐,随着swoole的版本迭代更新,已经足够稳定了,在阿里,腾讯,yy等各大公司都有着使用,也有很多游戏圈里的朋友也在使用,这些朋友经常会提到一个问题,每次代码更新还需要停止服务,然后重新启动,来达到更新代码,然而这种做法,是比较粗暴的。其实swoole里提供reload的特性,完全支持代码的热更新。
在介绍swoole的reload之前,先简要的讲讲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, master和manager是启动之后,就长驻内存的,所以这里reload的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.
  所以到了这里,reload的方案就呼之欲出了:
  我们把业务逻辑的脚本代码载入放到onWorkerStart里来。就行了。
示例:

 function onWorkerStart($serv,$worker_id) {

     include"hot_update_class.php";

     $class=newHotUpdate();  

 }


如果修改了hot_update_class.php里的相关文件,再执行$serv->reload(),就可以实现热更新了。
如果你使用了autoloader, 那么你把autoloader的注册放到onWorkerStart里来。
如果你使用了框架,那么你可以把框架的入口文件放到onWorkerStart里来。
如果你开启了opcache,那么,你可以在onWorkerStop的时候,执行相关的opcache清理工作。
(zend_opcache,直接调用opcache_reset()方法即可)

 function onWorkerStop($serv,$worker_id) {

     opcache_reset(); //zend_opcache的      

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

 }

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

swoole官方交流群:321637118


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题目1168:字符串的查找删除

题目1168:字符串的查找删除 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5092 解决:2097 题目描述:给定一个短字符串(不含空格),再给定若干字符串&#x…

C# 文件操作详解(三)---------Directory类

前面两篇介绍了File类和FileInfo类,对于文件的操作基本够用,但是后面还会补充一下FileStream相关的操作,例如StreamReader和StreamWriter的内容。本文主要介绍Directory类的使用,让我们一起看一下Directory类为我们提供了哪些操作…

js实现复制并能保留原格式粘贴;vue中点击复制粘贴功能;vue复制功能(不需要插件);

使用场景&#xff1a;vue项目中遇到点击按钮&#xff0c;复制文本的功能。复制成功后可以黏贴。 <div click"copyDesc">复制</div>methods:{copyDesc () {let url 这是复制的内容&#xff0c;可以是data的变量值或传递的参数等换行文字1换行文字2 let…

Libusb开发教程一 安装

1. 从官网下载需要使用的离线资源包&#xff1a; 进入 libusb.info 的 Download 页 下载 libusb-1.0.9.tar.bz2 下载 libusb-compat-0.1.4.tar.bz2 2. 实验平台 OS: Ubuntu16.04 Kernel: 4.4.0 3. 安装过程 <1> 拷贝步骤一中的离线包到 Linux 系统目录&#xff0c;一般…

在网上接外包

在网上接外包。这个需要一些沟通能力和英文能力 以下是一些可以接到外包的网站&#xff1a; 国内&#xff1a; http://www.taskcity.com/很难接到外包&#xff0c;今年在该网站只完成两个项目。 http://www.sxsoft.com/情况同上&#xff0c;一个小项目。 国外&#xff1a; http…

ocLazyLoad angular 按需加载

ionic 框架 1.引用 index.html 加载 <script type"text/javascript" src"lib/oclazyload/ocLazyLoad.min.js"></script> 2.注入 angular.module(starter, [ionic, oc.lazyLoad]) 3.配置 .state(app.myinfo, {url: /user/myinfo,views: {menuCo…

WIN10解包分区和磁盘分区教程

From: https://thinkpad.bbs.taobao.com/detail.html?postId5390151 新机到手第一件事情就是要系统解包和磁盘分区。建议在安装和卸载软件之前&#xff0c;进行磁盘分区&#xff0c;不然有可能只能分出原空间的50%&#xff0c;想要分更多空间&#xff0c;只能还原系统了。 一、…

调用 usb_control_msg 返回错误值 -32, Broken pipe, 对 hidraw write时 返回错误值 -32, Broken pipe

-------------------Step 1--------------------- 如题&#xff0c;使用 libusb 对 hid 类设备进行控制传输的时候&#xff0c;有时会遇到此错误&#xff0c;但是实际上传输是成功的&#xff0c;用usb分析仪等工具和程序中验证&#xff0c;比如发送数据成功后&#xff0c;让设…

element自定义图标;element自定义icon;element-ui自定义tab栏图标;

一、场景&#xff1a;element-ui本身提供了图标&#xff0c;但是不全面或者开发时候需要使用自定义图标展示。此时可以用到elemenUi的自定义图标。参考链接 二、html使用&#xff0c;和正常的element的 图标 i 标签使用一样&#xff0c;使用设置的类名class即可&#xff1a; &…

Music List

http://www.xiami.com/play?ids/song/playlist/id/1208666/type/3#loaded http://www.wlyxmusic.net/

Linux内核协议栈 NAT性能优化之FAST NAT

各位看官非常对不起&#xff0c;本文是用因为写的&#xff0c;如果多有不便敬请见谅代码是在商业公司编写的&#xff0c;在商业产品中也不能开源&#xff0c;再次抱歉This presentation will highlight our efforts on optimizing theLinux TCP/IP stack for providing network…

canvas文字居中;canvas画布文字右对齐;canvas画布文字左对齐;canvas文字自动换行;canvas设置行间距;

canvas参考手册 场景&#xff1a;画布绘制文本&#xff0c;使用 context.fillText(text,x,y,maxWidth)。文本对其也就是设置xy坐标问题。 以下的画布设定宽度假设都是width&#xff1a;500 一、canvas文本左对齐&#xff1a; 就是x轴设置为0即可。 var cdocument.getElementBy…

与朱元思书

风烟俱净&#xff0c;天山共色。从流飘荡&#xff0c;任意东西。自富阳至桐庐一百许里&#xff0c;奇山异水&#xff0c;天下独绝。 水皆缥碧&#xff0c;千丈见底。游鱼细石&#xff0c;直视无碍。急湍甚箭&#xff0c;猛浪若奔。 夹岸高山&#xff0c;皆生寒树&#xff0c;负…

nginx 405 not allowed问题的解决

From: http://www.cnblogs.com/mingaixin/p/4285329.html Apache、IIS、Nginx等绝大多数web服务器&#xff0c;都不允许静态文件响应POST请求&#xff0c;否则会返回“HTTP/1.1 405 Method not allowed”错误。 例1&#xff1a;用Linux下的curl命令发送POST请求给Apache服务器上…

php判断 二维数组中 是否 存在某个一维数组

<?php $arrs array (array (286,127.0.0.1 ),array (287,127.0.0.1 ),array (288,127.0.0.1 ),array (289,127.0.0.1 ) );$row array (289,127.0.0.1 );foreach ( $arrs as $arr ) {if(!judgeEqual($arr,$row)){echo 123;}//print_r ( $arr ); }//使用数组的差集来判断…

Linux文件去掉^M

1. 直接用 vim 编辑器打开文件&#xff0c;然后把字符串 "^M" 替换成空的就可以了。命令如下&#xff1a; 输入 &#xff1a; 号进入底行模式&#xff0c;然后输入&#xff1a; %s/\r//g &#xff0c;再 Enter 就可以了。 2. 使用现成的工具。命令如下&#xff1a; …

el-cascader回显失败;el-cascader回显不出来

—我的是省市联动&#xff0c;选择时候是正常的&#xff0c;得到的绑定值是数组 [‘安徽’,‘黄山’]&#xff0c;没问题&#xff1b; 但是在详情查看时候&#xff0c;回显成[‘安徽’,‘黄山’]&#xff0c;下拉框却不显示回显值。 —原因&#xff1a;虽然data里初始化声明变量…

No grammar constraints (DTD or XML schema).....两种解决方法

From: http://www.cnblogs.com/yqskj/archive/2013/01/11/2857065.html 方法一&#xff1a;常用方法 关闭XML验证 工具栏&#xff1a;windows > preferences > xml > xml files > validation > Indicate when no grammar is specified:选择Ignore即可。 方法二…

cursor管理

使用cursor的时候需要注意在使用完之后将其关闭&#xff0c;什么时候关闭也是一个需要注意的问题&#xff0c;稍不小心就可能会出错。我们自己管理cursor可能不是那么容易&#xff0c;问题出现这个或那样的问题&#xff0c;Android系统提供了一套curosr的管理&#xff0c;下面让…

数字金额加逗号;js给数字加三位一逗号间隔的两种方法;js数据格式化

需求&#xff1a;数字金额&#xff0c;按照三位一个逗号显示。既 千 百万 十亿 或者是按照固定的几位一个逗号展示。 方法1&#xff1a; <script type "text/javascript">//保留三位小数&#xff0c;toLocaleString() 方法可把一个 Number 对象转换为本地格…