本人参与的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进程,(而我们的业务逻辑正好都在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方法里。

示例:

function onWorkerStart($serv,$worker_id) {

 include"hot_update_class.php";

 $class=newHotUpdate();  

}

function onWorkerStop($serv, $worker_id) {

  opcache_reset(); //zend_opcache的opcache清理函数

}

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

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


如果你使用了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会把这些都清理掉,可能导致一些逻辑错误,解决方案正在酝酿中)

昨天还阳光明媚,今天却温度骤降,下起了大雨。
这还不是什么郁闷的事,
刚起来就被拉来做事,搬了43箱橙汁和43箱四特酒到车上。
手都累酸了,然后坐老爸的车送到了一个工厂(OH,My God),又重复搬下车。
回来的时候,在路旁看到一个牌子写着标语:
经济要发展 人口要控制 社会要和谐
我饶有兴致的琢磨起来了
这到底是三个无关的标语还是一体的呢
如果是三个无关的标语那就应该这样去理解
经济要发展(国策一)
人口要控制(国策二)
社会要和谐(国策三,胡叔叔提出的,最近较火的)
如果是一体的,应该这样去理解
经济要发展,那么人口是要控制嘀,这样社会才会和谐的。
我们无从知道他这个标语的本意是什么,但我更倾向于第一种
其实这就是三个没有太大联系的标语
现在很多人都认为,我国的贫穷是人口过多造成的
但想想日本,你就不会那么认为了(以夷制夷,早日建立倭国特别行政区)
可能很多人会觉的我无聊
其实看任何问题都不往一个方面钻牛角尖,多开拓思路未必是件坏事
很多的小事情可以折射出大问题
朋友你觉的呢?

sina的HR给偶来电话了,是诚邀偶去面试了。

其实做为sina这样的互联网内知名的公司,偶还是无比向往的。
但就目前而言,去北京是不太可能的了,看样子这个机会只能眼睁睁的看它溜走了。

或许人生就是这么多无奈,这么多的眼睁睁而又无力改变的事情。
各种各样的情,各种各样的事都时刻在牵伴着你。
我一直认为能干大事的人一定有坚定的心说的极端点就是能狠的下心来,可这似乎是我性格的弱点,我觉的自己是个感情丰富,多愁善感的人。
对人对事总是极力往好的方面想,总是宁愿自己吃点亏。
然而这样的性格却造就了我犹豫不决的性格,这往往使我非常的苦恼也非常的彷徨,在一次一次抉择的面前选择了逃避,选择了服从大家,进而牺牲的是自己的理想。

一次次在夜静人深的时候,都会感到特别的无助,也一直给自己打气,要自己学会坚韧。

要自己学会狠下心
每天都在梦想的自己的梦想
因为我不能连梦想都丢了

我觉得我现在需要改变了,我不想平凡的过日子,我需要挑战,我需要挫折,更需要是一次次挫折背后成功的喜悦。

当老师一个星期不到
可已经身心疲惫了
之前总认为老师很好当
等自己走向这个岗位的时候
却发现,原来不是这样的......

先说说这几天我是怎么过来的

8-31号下午领了教材,课表
对了一下课表
发现明天(9.1)号下午有节课(比较幸运).
可以多点时间备课
由于第一节课一般是讲绪言部分
内容很少
所以为了讲完这节课是绞尽脑汁的想怎么来扩充..

9-1周四)下午
第一节如期到来
说真的
在进教之前就已经很紧张了
因为第一节课是一个树立形象的关键
所以不能出什么差错
进了教室之后
本来想到的一段开场白
因为紧张..
一吓子忘记了
所以就很仓促的开始讲课了
因为内容少,而且语速又比较快
讲完内容的时间,还有十分钟多.
这十分钟就很尴尬的挨过去了
下了课
就飞一般的逃到了办公室
总体来讲
这个第一次不太理想
回去之后认真的总结了一下
发现有以下原因

   1、备课还不是十分充足
   2、语速太快
   3、字太草

总结后,认真的开始备第二堂课了
这一晚,没怎么睡着,一晚都在想如何上好明天的课.

9.2(周五) 有两节课
上午第一节课还是昨天那个班的课
是第二节课,心情已经平静了很多
课也备的比较充足,虽然上课还是不怎么的好
但已经比第一节课好多了
中午在家上网查了一些化学史的资料
因为下午第二节另外一个班的第一节要上了
为了避免和昨天一样
所以就查了很多化学史的资料
以免到时没什么可说的
由于准备充分,这节课上的还不错
一节课感觉一下子就完了
而且时间刚好
晚上继续备课
因为明天周末
有两节课,连在一起的
而且是第三个班的第一次照面
但由于有今天下午的经验
我已经比较放松了.

9.3号(周六)两节课
整整站了两节课
上课氛围已经比较轻松
两节课轻而易举的过去了
周六下午没有课
但一下也不能放松
因为明天整整有8节课(说起来吓死人)
有一个班有四节课
有一个班也有四节课
所以我至少得备三节新课
这下子有得累了
可以说周六开完会回来5点钟左右
到晚上十二点,一直在备课,一直在思考如何上课

9.4(周日)
天啊, 今天整整8节课
由于昨天的备课已经准备比较充分了
所以都按步就班来了..
但是嗓子实在扛不住了.

就这么几天下来
感觉上课就很机械了
这就是考验一个老师耐心和责任的时候了
当一名合格的老师
责任是第一位的
我相信这点我还是有的
不过经过从我教的三个班反馈回来的意见

我有以下几个有待提高的方面:

 1. 语速太快, 有时他们听不清.

 2. 说话有时比较小 (看样子,偶要练练嗓子了)

 3. 讲课太快 (有时一些问题在他们还没有完全弄懂就一带而过了)

而他们反馈回来的优点有:

 1.上课比较幽默,轻松

 2.能时时调动他们听课的注意力

 3.比较平易近人

这几点我以后还得保留.

反正,教师这个职业就是这样
这几天下来,偶没睡一个好觉
做一个有责任的老师
才是一名合格的老师
我相信我能成为一名优秀的教师的!

现在进退两难中....
我真的不好意思提出辞职.
我这个人就是这么重感情.天生的.

第一,我是真的不好意思提出辞职.
第二,不知公司扣压的800块会还我不.
第三.可能还有点愧疚的心理.

这几天一直在犹豫中..
辞职报告几天都没交上去了.
眼看四月份一天一天的过去了.
有时候我也老反省自己.
为什么这没心软.狠不下心呢.
哎,这就是我的本性.

再说,我怕我现在说辞职,那800块拿不到.
而最近我的工作也不是很满意,使我充满的愧疚心理.

不想了,得过且过吧.马上回学校把章盖了,把办教师资格证的材料拿回来!
大不了不要那800块钱了!!