原理是在函數執行前先設定一個時鐘信號,如果函數的執行超過規定時間,信號會被觸發,信號處理函數(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擴展可以支持php的多線程操作,原本需要重新編譯PHP的后面configrue提示加上--enable-pcntl,為了省事直接編譯算鳥,代碼如下:
- # cd /usr/local/src/php-5.2.6/ext/pcntl
- # phpize
- # ./configure --with-php-config=/usr/local/php/bin/php-config
- # make && make install
新聞熱點
疑難解答