1.什么是信号
信号是一个消息,由操作系统或者应用程序发送到我们的程序里。信号是单向异步通知的机制,信号可以从内核发送到进程,也可以从一个进程发送到另一个进程,或者一个进程发送给自己。
2.操作系统支持的信号有哪些

3.PHP信号处理的流程
1.安装信号处理- pcntl_signal
2.发送信号- posix_kill
3.分发信号- pcntl_signal_dispatch (这边注意,如果没有分发的话,pcntl信号处理只支持declare(tick)的机制才能分发信号)
tick机制性能比较低,具体的可以参考韩天峰前辈写的介绍:http://rango.swoole.com/archives/category/php_system_program
4.处理信号-pcntl_signal(callback)
5.补充(libevent支持信号的处理)
4.代码演示
下面我就举一个父进程每隔10秒发送信号给子进程的例子。
<?php
$pid = pcntl_fork();
if ($pid == -1) {
exit;
} else if ($pid) {
function tick_handler()
{
global $pid;
echo '每隔10秒向子进程发送信号' . time() . PHP_EOL;
posix_kill($pid, SIGUSR1);
}
while (1) {
sleep(10);
tick_handler();
}
} else {
function sig_parent_handler($signo)
{
switch ($signo) {
case SIGUSR1:
echo '接收到来自父进程的信号SIGUSR1' . PHP_EOL;
break;
default:
echo 'default' . PHP_EOL;
break;
}
}
pcntl_signal(SIGUSR1, 'sig_parent_handler');
while (1) {
echo 'child:'.time().PHP_EOL;
usleep(1000*1000);
pcntl_signal_dispatch();
}
}
pcntl_waitpid($pid, $status, WUNTRACED);

<?php
function signal_handler($signal)
{
echo $signal . PHP_EOL;
}
$eventBase = new EventBase();
$event = Event::signal($this->eventBase, SIGUSR1, ['signal_handler']);
$event->addSignal();
$eventBase->loop();
如无特殊说明,文章均为本站原创,转载请注明出处。如发现有什么不对的地方,希望得到您的指点。