这篇文章主要介绍了关于php进程信号处理,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
<?php
while (1)
{
echo "i am doing something important\n";
echo "if i am interruptted, the data will be corrupted\n";
echo "be careful\n";
echo "\n\n";
sleep(5);
}
假设现在有以上这么一个php脚本,我们想要脚本在收到sigint、sigterm等进程信号时,输出一段信息并结束脚本,该如何实现呢?
使用pcntl_signal和pcntl_signal_dispatch函数即可(注意php需要安装pcntl扩展才能使用这两个函数),见代码:
<?php/**
* 信号id和信号名称对应关系,没注释掉的信号都是可以通过pcntl_signal函数注册的
*/
$globals['g_sig_map'] = array(
1 => 'sighup',
2 => 'sigint',
3 => 'sigquit',
4 => 'sigill',
5 => 'sigtrap',
6 => 'sigabrt',
7 => 'sigemt',
8 => 'sigfpe',
//9 => 'sigkill',
10 => 'sigbus',
11 => 'sigsegv',
12 => 'sigsys',
13 => 'sigpipe',
14 => 'sigalrm',
15 => 'sigterm',
16 => 'sigurg',
//17 => 'sigstop',
18 => 'sigtstp',
19 => 'sigcont',
20 => 'sigchld',
21 => 'sigttin',
22 => 'sigttou',
23 => 'sigio',
24 => 'sigxcpu',
25 => 'sigxfsz',
26 => 'sigvtalrm',
27 => 'sigprof',
28 => 'sigwinch',
29 => 'siginfo',
30 => 'sigusr1',
31 => 'sigusr2',
);
/**
* 进程信号处理函数
* @param int $signo 信号id
*/function signalhandler($signo) {
if (isset($globals['g_sig_map'][$signo])) {
echo "caught signal {$globals['g_sig_map'][$signo]}, exit\n";
} else {
echo "caught unknown signal:$signo";
}
exit();
}foreach ($globals['g_sig_map'] as $id => $name) {
pcntl_signal($id, 'signalhandler');
}while (1) {
echo "i am doing something important\n";
echo "if i am interruptted, the data will be corrupted\n";
echo "be careful\n"; echo "\n\n";
pcntl_signal_dispatch(); // 此函数调用必须放在循环体内
sleep(5);
}
在linux shell中执行该脚本,然后使用kill -2 脚本进程id命令向进程发送信号,脚本正常输出信息并退出。
相关推荐:
php进程间通信详解
php进程通信基础之信号量与共享内存通信
php进程锁的有关内容
以上就是php进程信号处理的详细内容。