php set_time_limit()用法測試詳解

來源:互聯網
上載者:User

一個php指令碼通過crontab每5分鐘執行一次,考慮到指令碼執行時間會超過5分鐘,特意用set_time_limit(290)來控制指令碼在290秒退出。某天突然發現後台有多個該指令碼的進程在執行,也就是說set_time_limit(290)沒有起作用。為了證明,特意使用如下代碼測試。

 代碼如下 複製代碼

set_time_limit(5);

for ($i = 0; $i < 100; $i++) {
    echo date('Y-m-d H:i:s') . "n";
    sleep(1);
}

無論是在web還是CLI下,上述指令碼並沒有在5秒鐘後退出。後來加上ini_set(‘max_execution_time’, 5)測試,結果一樣。那是不是說明set_time_limit函數根本就沒有用呢?其實不然,在 http://stackoverflow.com/questions/5874950/set-max-execution-time-in-php-cli 這裡找到根源所在,其實是上面的寫法有問題,例如使用下述代碼:

 代碼如下 複製代碼

set_time_limit(5);

for (;;) {
}

執行後,大概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中寫到:

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.

 

 代碼如下 複製代碼
<?php
//set_time_limit(0);
$i=1500;
include ("inc/conn.php");
while($i>0)
{
$sql="INSERT INTO php (php)
VALUES ('$i')";
if ($conn->execute($sql)===flase)
{
//echo "資料插入錯誤".$conn->errormsg();
}
else
{
$phpid=$conn->Insert_ID();
echo $i."已經存入資料庫,編號:".$phpid;
}
$i--;
echo "<hr>";
}
?>

注意:sleep函數暫停時間也是不計入指令碼的執行時間的。所以也是第一個測試失敗的原因。

當你的頁面有大量資料時,建議使用set_time_limit()來控制已耗用時間,預設是30s,所以需要你將執行時間加長點,如 set_time_limit(300)  ,其中將秒數設為0 ,表示持續運行!

如:set_time_limit(0)表示長時間連結運行!

注意:這個函數的運行需要你關閉安全模式,在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頁面的最大執行時間,比如下面:

 代碼如下 複製代碼
set_time_limit(900);

這個函數指定了當前所在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秒就有提示資訊了.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.