2016-10-28 85 views
1

我使用pcntl_alarm()的東西考慮,所以對其進行測試我跑,你可以隨處找到的示例的變化,當你谷歌pcntl_alarm:php pcntl_alarm - pcntl_signal處理程序不會觸發?

function signal_handler() 
{ 
    echo "Caught SIGALRM\n"; 
    exit; 
} 
pcntl_signal('SIGALRM', 'signal_handler'); 

pcntl_alarm(3); 

for($i = 1; $i <= 6; $i++) { 
    echo "$i "; 
    sleep(1); 
} 
echo "Normal exit\n"; 

預期輸出:

1 2 3 Caught SIGALRM

實際產量:

1 2 3 Alarm Clock

我試過在pcntl_signal()電話報價SIGALRM(因爲它需要int),但隨後的警報似乎沒有不火:

1 2 3 4 5 6 Normal exit

我假設Alarm Clock輸出是由於默認處理程序和我的signal_handler()沒有被調用。是SIGALRM正確的常數?我錯過了什麼?我正在linux下運行CLI(centos),已經嘗試了php 5.5和5.6。

回答

1

SIGALRM是一個常數,你可以這樣做,請參閱:

echo SIGALRM; //14 

還需要使用 pcntl_signal_dispatch您的循環內檢查待處理的信號。

function signal_handler() 
{ 
    echo "Caught SIGALRM\n"; 
    exit; 
} 
pcntl_signal(SIGALRM, 'signal_handler'); 

pcntl_alarm(3); 

for($i = 1; $i <= 6; $i++) { 
    echo "$i "; 
    sleep(1); 
    pcntl_signal_dispatch(); 
} 
echo "Normal exit\n"; 

Goodluck!

+0

對'pcntl_signal_dispatch()'的調用是我錯過了。 –

相關問題