您好,欢迎访问一九零五行业门户网

PHP进程信号处理

这篇文章主要介绍了关于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进程信号处理的详细内容。
其它类似信息

推荐信息