二:php基础进程相关函数
注意:(需要pcntl扩展支持)
具体相关函数可查看php手册:http://php.net/manual/zh/book.pcntl.php
1:declare(ticks=1);每执行一条php低级语句,则触发一次register_tick_function函数,并且每执行1条低级语句会检查一次该进程是否有未处理过的信号.,该函数是在php版本小于5.3,用于php进行php信号处理的函数,例如:
|
在php7.2中,运行结果如下:
2:pcntl_signal;注册一个信号处理函数,和declare(ticks=1)组合使用:
|
当执行该脚本,再ctrl+c的时候,将会捕捉到该信号,并输出,如图:
3:getmypid.获取当前进程id,posix_kill发送信号
为什么会拿这2个一起说呢?因为posix_kill函数如果需要发送信号,是需要进程id的,而getmypid(),则是获取当前进程id的函数,
以下是将上面的函数组合使用的例子:
|
|
运行文件1结果:
运行文件2之后文件1结果:
4:到这之后,你可能会想到,declare每次运行一次低级语句,都会尝试执行2种结果,效率会不会很差呢?答案是会的,所以在php5.3之后,有了新的函数,那就是pcntl_signal_dispatch
pcntl_signal_dispatch: 调用等待信号的处理器,有了它,将不在需要declare,只需要在循环中增加该函数,就可以调用信号通过了:
|
结果和3同样
5:看到4,你可能会觉得,信号处理还是没有那么的智能,能不能不做死循环,就完成异步的信号接收并处理呢?在php7.1之后,有了新的信号处理函数:pcntl_async_signals,返回或设置是否异步信号处理:
|
|
首先文件1运行,再给文件2运行之后,文件1的结果图:
文件1进程strace 命令截图:
可看到,进程休眠之后,被9271进程(文件2)唤醒之后并发送了siguse1信号,再然后输出了一段文字,再然后自己给自己发送了进程休眠信号,继续休眠
linux 查看进程命令.可看:
https://blog.csdn.net/liangzhao_jay/article/details/50457197
6:pcntl_alarm和创建一个计时器,在指定的秒数后向进程发送一个SIGALRM信号。每次对 pcntl_alarm()的调用都会取消之前设置的alarm信号。例如:
|
该函数使用场景之一:php熔断
|
先进行30秒的定时,当处理函数超过30秒时,将触发php处理超时函数,从而进行超时逻辑,当在30秒处理完毕时,php将关闭改定时信号,正常往下执行
三:其他
1:php进程信号中,无法捕获SIGKILL信号,该信号将会强制关闭进程






