如何防止一個函數執行時間過長呢?在PHP裡可以用pcntl時鐘信號+異常來實現。
代碼如下:
declare(ticks = 1); function a(){ sleep(10); echo "a finishi\n"; } function b(){ echo "Stop\n"; } function c(){ usleep(100000); } function sig(){ throw new Exception; } try{ pcntl_alarm(1); pcntl_signal(SIGALRM, "sig"); a(); pcntl_alarm(0); }catch(Exception $e){ echo "timeout\n"; } b(); a(); b();
原理是在函數執行前先設定一個時鐘信號,如果函數的執行超過規定時間,信號會被觸發,信號處理函數會拋出一個異常,被外層代碼捕獲。
這樣就跳出了原來函數的執行,接著執行下面的代碼。如果函數在規定的時間內,時鐘信號不會觸發,在函數結束後清除時鐘信號,不會有異常拋出。