首頁  >  文章  >  後端開發  >  PHP學習之訊號處理機制的操作

PHP學習之訊號處理機制的操作

little bottle
little bottle轉載
2019-04-18 17:35:002265瀏覽

本文主要描述了用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中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除