這篇文章主要介紹了關於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中文網其他相關文章!