一個php腳本經過crontab每5分鐘執行一次,考慮到腳本執行時間會超過5分鐘,特地用set_time_limit(290)來控制腳本在290秒退出。某天忽然發現後臺有多個該腳本的進程在執行,也就是說set_time_limit(290)沒有起做用。爲了證實,特地使用以下代碼測試。php
代碼以下 | |||||
|
不管是在web仍是CLI下,上述腳本並無在5秒鐘後退出。後來加上ini_set(‘max_execution_time’, 5)測試,結果同樣。那是否是說明set_time_limit函數根本就沒有用呢?其實否則,在 http://stackoverflow.com/questions/5874950/set-max-execution-time-in-php-cli 這裏找到根源所在,實際上是上面的寫法有問題,例如使用下述代碼:html
代碼以下 | |||||
|
執行後,大概5秒鐘就能夠看到」Fatal error: Maximum execution time of 5 seconds exceeded in」相似這樣的錯誤提示。說明set_time_limit是起做用的。如今在去看看官方文檔(http://www.php.net/manual/en/function.set-time-limit.php)上關於此函數的說明,在Note中寫到:linux
The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.web
例sql
代碼以下 | |||
|
注意:sleep函數暫停的時間也是不計入腳本的執行時間的。因此也是第一個測試失敗的緣由。數據庫
當你的頁面有大量數據時,建議使用set_time_limit()來控制運行時間,默認是30s,因此須要你將執行時間加長點,如 set_time_limit(300) ,其中將秒數設爲0 ,表示持續運行!apache
如:set_time_limit(0)表示長時間連接運行!windows
注意:這個函數的運行須要你關閉安全模式,在php.ini中將safe_mode = Off 安全模式設置爲Off,不然將會出現下面錯誤:安全
Warning: set_time_limit() [function.set-time-limit]: Cannot set time limit in safe mode in服務器
再次注意的是:
在php.ini能夠經過定義max_execution_time來設置PHP頁面的最大執行時間,好比下面:
代碼以下 | |||
|
這個函數指定了當前所在php腳本的最大執行時間,
雖然設定值是900秒,實際上
最大執行時間=php.ini裏的max_execution_time數值 - 當前腳本已經執行的時間 + 設定值
假如php.ini裏的max_execution_time=30,當前腳本已經執行10秒,則:
最大執行時間=30-10+900=920秒。
php中設置set_time_limit不起做用的解決方法:
set_time_limit用來設置腳本的超時時間,用法以下:
set_time_limit(秒數);
規定從該句運行時起程序必須在指定秒數內運行結束,
超時則程序出錯退出.
可是有時候設置set_time_limit沒有效果,set_time_limit函數最好是在linux下執行,windows執行可能也無效
解決方法:
修改php.ini裏的max_execution_time = 30了。這個默認是30秒,修改成max_execution_time = 300.從新啓動apache服務器。這樣超時設置爲300秒就有提示信息了.