原理是在函數執行前先設定一個時鐘信號,如果函數的執行超過規定時間,信號會被觸發,信號處理函數(sig)會拋出一個異常,被外層代碼捕獲。這樣就跳出了原來函數的執行,接著執行下面的代碼。如果函數在規定的時間內,時鐘信號不會觸發,在函數結束後清除時鐘信號,不會有異常拋出
到php官方查看此函數說明
pcntl_alarm (PHP 4 >= 4.3.0, PHP 5)
pcntl_alarm — 為進程設置一個alarm鬧鐘信號
說明¶int pcntl_alarm ( int $seconds )
創建一個計時器,在指定的秒數後向進程發送一個SIGALRM信號。每次對 pcntl_alarm()的調用都會取消之前設置的alarm信號。
參數¶seconds 等待的秒數。如果seconds設置為0,將不會創建alarm信號。
返回值¶返回上次alarm調度(離alarm信號發送)剩余的秒數,或者之前沒有alarm調度(譯注:或者之前調度已完成) 時返回0。
實例
<?php
declare(ticks = 1);
function a()
{
sleep(10);
echo "a finishin";
}
function b()
{
echo "Stopn";
}
function c()
{
usleep(100000);
}
function sig()
{
throw new Exception;
}
try
{
//設置一個鬧鐘信號為一秒鐘執行一次
pcntl_alarm(1);
//安裝鬧鐘信號,並綁定callback
pcntl_signal(SIGALRM, "sig");
a();
//取消鬧鐘信號
pcntl_alarm(0);
}
catch(Exception $e)
{
echo "timeoutn";
}
b();
a();
b();
附,pcntl擴展安裝
pcntl擴展可以支持php的多線程操作.
原本需要重新編譯PHP的後面configrue提示加上--enable-pcntl
為了省事直接編譯算鳥.
代碼如下 復制代碼 # cd /usr/local/src/php-5.2.6/ext/pcntlpcntl.so 加到php.ini中OK