在点滴中成长

【原】关于Linux系统信号的PHP处理

生命不可能有两次,但许多人连一次也不善于度过。 --吕凯特

引子

在前文中我分别说到了PHP的定时任务和守护进程的相关实现,那么问题又来了,守护进程,理想状态下其应该是一直在运行中的,中途不应该停下来,特别是因为加载配置而终止程序是更加不应该的,但是程序在运行之初就已经被加载到了内存中去,那么想要重新加载配置,除了重启,还有别的办法么?答案是有的!那就的借助Linux的系统信号了。

系统信号

说道Linux的系统信号,可能有很多人是第一次听说。其实,你也不必感到陌生,因为你经常有用到。举个很简单的例子,我们想要终止进程的时候,我们往往会用 kill progressId 这个其实就是我们向程序发送了一个终止进程的信号,程序收到后就会直接作出响应,当然这是Linux系统在帮你做了,所以你在程序本身并不需要做太多的额外编码。如果你想要细节的了解Linux的系统信号,可以自行去google,这里就不做太多的赘述!不过还是要啰嗦一句 各个发行版的Linux系统中的系统信号并不是100%完全一样的,这点必须要注意!

PHP处理系统信号

我们这里将要借助 pcntl 这个PHP自带扩展库,代码实现到是变的不是那么复杂了,寥寥几行即可完成:

<?php
declare(ticks = 1); //这个必须有!!!!
addConf();
pcntl_signal(SIGUSR2, "addConf"); //表示接收到USR2信号的时候执行addConf函数
?>

假设当前PHP守护进程的进程ID为8866,那么我们在不终止进程的时候使用命令kill -USR2 8866即可完成信号发送,然后我们的程序就会抓住信号,去执行addConf函数。

最后说两句,有时候问题的答案并不是复杂的难以想象,反而有时候简单的有点惊人,但是我们享受的是发现问题答案的过程,不是么?