扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章给大家分享的是有关PHP程序员的信号处理案例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
专注于为中小企业提供成都网站设计、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业龙沙免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。信号就是事件发生时,对进程的一种通知机制(也叫软件中断)。当一个进程收到信号后,内核会暂停该进程正在执行的代码,并跳转到对应的信号处理函数中,如果处理函数不中断,执行完处理函数后,会继续执行之前中断的地方往下执行。
我们在FPM模式下写代码,不会遇到信号处理相关的问题,但是CLI模式下一些常驻内存的脚本,如何能够自由的重启、关闭、退出前做一些清理工作(断开链接,删除临时文件等)?
上图中,我为信号SIGINT
注册了处理函数sigint_handle
,捕获到信号后,输出内容后退出,简单易懂吧。执行gcc -o run run.c && ./run
,然后CTRL+C
(会触发SIGINT
信号),成功输出:成功捕获到信号2!
,程序直接结束运行。
pcntl_signal
是PHP的信号处理注册方法,上面实现的功能和C实现的基本一致,不同的是,当前进程不会退出,并且多输出了一个signinfo
(PHP是C写的,为啥刚刚C语言的没有信号相关的信息呢?因为PHP使用的是另一个信号函数sigaction
,有兴趣的可以了解一下)
这个是pcntl初始化的时候,将pcntl_signal_dispatch
注册为tick的处理函数
pcntl_signal
会将处理函数放到信号集合中(PHP的hash table),而php_signale4
最终会调用sigaction
进行底层的信号管理。
这里我省略了大量代码,将关键的点标记了出来,其实PHP维护一个自己的信号集合,每当调用pcntl_signal_dispatch
时就会查询是否有信号,上面的SIG_BLOCK
会将信号阻塞,这样只有我们把关键的代码执行完毕之后,再去触发信号处理函数以保证数据和程序逻辑的完整性。
经常见到身边的程序员们,每当需要重启PHP-FPM
进程的时候,使用的招数是kill掉所有PHP进程,然后新启动。一般情况没啥问题,但有些时候可能某个进程的任务还没执行完,直接把人家中断了略显粗暴。其实只要你给PHP的Master进程发送一条USR2
信号,它便会再处理完所有任务后,重启子进程,这才是所谓的优雅~
上图是我简单写的一个例子,如果我们想让进程优雅退出的时候,只需要发送SIGTERM
信号即可。需要注意的是SIGKILL
和SIGSTOP
信号会略过信号阻塞会将进程直接停止,还有就是信号会中断睡眠(SLEEP),sleep
如果没执行完会返回剩下的秒数,有兴趣可以试试。
信号相关的知识点其实有很多,还需要继续深入研究~上文中的PHP源码为7.1.25版本,各个版本可能不太一样。
感谢各位的阅读!关于“PHP程序员的信号处理案例”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流