本文主要描述了用PHP語言寫的訊號處理機制的實例,具有一定參考價值,有興趣的朋友來學習一下。
function sig_handler($sig) { print("handled sig: $sig\n"); } pcntl_signal(SIGIO, "sig_handler"); posix_kill(posix_getpid(),SIGIO); while(true) { posix_kill(posix_getpid(),SIGIO); pcntl_signal_dispatch(); sleep(1); }
最好自己手動循環處理訊號佇列,而不是使用php提供的的declare(ticks=1),tick_handler()這種訊號處理機制,因為tick機制的效能問題,每執行一條語句都回呼tick_handler查看是否有訊號,而很大部分時間是沒有訊號的。
posix_signal設定訊號的回呼處理,
posix_kill只是把訊號放入行程的訊號待處理佇列中,所有並不會觸發訊號回呼,由pcntl_signal_dispatch處理訊號佇列中的訊號
posix_getpwnam("nginx"):取得使用者名稱的uid,gid等資訊
pcntl_signal(SIGPIPE, SIG_IGN, false):忽略核心發出的SIGPIPE訊號,當連線已closed,進程繼續發資料到無效socket,系統會收到含RST 控制位TCP包,系統會發出一個SIGPIPE訊號給進程,告訴進程這個連接已經斷開了,不要再寫了。該訊號的預設處理是終止進程,進程可以捕獲它並忽略該訊號以免不情願的被終止。
socket上下文選項:
backlog:用於限制流監聽佇列中未完成連線的連線數量
so_reuseport:重複使用連接埠(由核心排程連接到多個監聽同一個連接埠的進程,由於是透過hash方式來標誌連接對應的進程,所以監聽進程數是不能改變的,)
定時器訊號處理
pcntl_signal(SIGALRM,"sig_handler"); pcntl_alarm(2); function sig_handler($sig) { echo "one second after"; } while (1) { pcntl_signal_dispatch(); sleep(1); }
相關教學:php程式設計從入門到精通
以上是PHP學習之訊號處理機制的操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!