【1、信号】
对于Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。
1、信号的种类
这里列举1-31号信号。剩余的信号请查看kill -l
* 注:Linux操作系统定义的62
个信号,每个信号都有对应的一个编号和宏定义名称,这些宏定义可以在 kill - l 中找到。其中1-31
号信号为普通信号
,34-64
号信号为实时信号
,一旦发出信号则立即去处理。
【2、 PHP如何给进程安装信号处理】
php版本低于5.3时的策略思路:每次执行一条语句检测是否有信号发送给程序;由于不知道什么时候会有信号过来,所以需要逐步检查,导致效率很低
<?php
//设置每次执行一条语句检测是否有信号
declare(ticks=1);
//注册信号处理函数
register_tick_function('sigal');
//根据信号处理逻辑
function sigal($sigal)
{
echo $sigal;
}
while(1)
{
sleep(1);
}
php版本在5.3以后 7以下的时候采取的是 pcntl_signal_dispatch
<?php
//注册当前进程的信号处理
pcntl_signal_dispatch();
//注册 发生SIGINT 对应的处理逻辑
pcntl_signal(SIGINT,function(){
//to do...
});
while(true)
{
sleep(1);
}
php版本在7以后 采取的是异步处理 (效率最高)
<?php
//设置当前进程信号异步处理
pcntl_async_signals(true);
pcntl_signal(SIGINT,function(){
//to do ...
});
while(true)
{
sleep(1);
}
【3、简单举例】
需求:程序在30秒后自动退出(php7版本);
<?php
//注册当前异步处理信号模块
pcntl_async_signals(true);
//注册自定义信号
pcntl_signal(SIGUSR1,function(){
echo '出发了自定义信号,进程执行退出'.PHP_EOL;
posix_kill(getmypid(),SIGQUIT);
});
//设定初始时间
$time=0;
while(true)
{
//如果大于30秒就触发自定义信号
if($time>30) posix_kill(getmypid(),SIGUSR1);
sleep(1);
$time++;
}
过了30秒后,进程执行退出。
【4、注意事项】
注意: 9号信号 不可被捕捉。 系统保留用于强制退出进程;