我有一個很長的腳本需要執行,所以當我運行它時,它會在我的web服務器上達到最大執行時間並最終超時。PHP將腳本分散到多個部分以避免服務器超時
爲了說明這一點,想象一下,假設我有一個for循環,它可以讓一些非常密集的操作一百萬次。我怎麼能把這個循環執行分散在幾個部分,這樣我就不會碰到我的Web服務器的最大執行時間?
非常感謝,
我有一個很長的腳本需要執行,所以當我運行它時,它會在我的web服務器上達到最大執行時間並最終超時。PHP將腳本分散到多個部分以避免服務器超時
爲了說明這一點,想象一下,假設我有一個for循環,它可以讓一些非常密集的操作一百萬次。我怎麼能把這個循環執行分散在幾個部分,這樣我就不會碰到我的Web服務器的最大執行時間?
非常感謝,
如果你有一個應用程序即將循環已知次數(即,您確定它將完成一段時間),則可以增加循環內的時間限制:
foreach ($data as $row) {
set_time_limit(10);
// do your stuff here
}
該解決方案將保護您免受一次失控迭代的影響,但只要您需要,您的整個腳本都可以不受干擾地運行。
是的,這顯然是我的情況下去的路。非常感謝 ! – silkAdmin
最好的解決辦法是使用http://php.net/manual/en/function.set-time-limit.php改變超時。否則,您可以使用301重定向在超時時間發送到更新的URL。
$threshold = 10000;
$t = microtime();
$i = isset($_GET['i']) ? $_GET['i'] : 0;
for($i; $i < 10000000; $i++)
{
if(microtime - $t > $threshold)
{
header('Location: http://www.example.com/?i='.$i);
exit;
}
// Your code
}
瀏覽器只會在停止之前尊重一些重定向,您最好使用javascript強制頁面重新加載。
如果你有你的託管服務器的權限,你可以使用PHP解釋器來執行一個PHP腳本,並讓它在後臺運行。
我終有一天使用了一種技術,將工作從一個文件分解爲三部分。這只是一系列具有密集操作的120.000個元素。我創建了一個分割腳本,將數組存儲在每個大小爲40.000的數據庫中。然後我創建了一個帶有重定向到第一個PHP文件的HTML文件來計算第一個40.000元素。在計算完第一個40.000元素之後,我再次將HTML轉發到下一個PHP文件,依此類推。
不是很優雅,但它的工作:-)
如果您正在運行需要執行未知時間的腳本,你可以使用:
如果可能,您可以製作腳本以便處理所需操作的一部分。一旦它完成了10%,你通過AJAX再次調用腳本來執行下一個10%。但有些情況下這不是一個理想的解決方案,它取決於你在做什麼。
我用這種方法創建了一個基於網絡的爬蟲程序,它只能在我的電腦上運行。如果它必須立即執行操作,它也會超時。所以它被分成200個「任務」,一旦前一個完成,每個任務都通過Ajax調用。完美的工作,它已經運行了一年多(爬行?)
set_time_limit怎麼樣? – dmitry