【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++;
}

PHP 使用信号实现对进程的控制-LMLPHP

过了30秒后,进程执行退出。

【4、注意事项】

注意: 9号信号 不可被捕捉。 系统保留用于强制退出进程;

08-28 13:43