2012-01-26 49 views
1

我有一個很長的腳本需要執行,所以當我運行它時,它會在我的web服務器上達到最大執行時間並最終超時。PHP將腳本分散到多個部分以避免服務器超時

爲了說明這一點,想象一下,假設我有一個for循環,它可以讓一些非常密集的操作一百萬次。我怎麼能把這個循環執行分散在幾個部分,這樣我就不會碰到我的Web服務器的最大執行時間?

非常感謝,

+0

set_time_limit怎麼樣? – dmitry

回答

2

如果你有一個應用程序即將循環已知次數(即,您確定它將完成一段時間),則可以增加循環內的時間限制:

foreach ($data as $row) { 
    set_time_limit(10); 
    // do your stuff here 
} 

該解決方案將保護您免受一次失控迭代的影響,但只要您需要,您的整個腳本都可以不受干擾地運行。

+0

是的,這顯然是我的情況下去的路。非常感謝 ! – silkAdmin

1

最好的解決辦法是使用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強制頁面重新加載。

+1

或者更好的是,跳過重定向並使用AJAX – Leigh

+0

感謝amccausl,這正是我想到的,但我跳到調查也許更優雅的解決方案,雖然我認爲在PHP中運行這樣的腳本只是不優雅開始..乾杯 – silkAdmin

0

如果你有你的託管服務器的權限,你可以使用PHP解釋器來執行一個PHP腳本,並讓它在後臺運行。

請參閱Asynchronous shell exec in PHP

1

我終有一天使用了一種技術,將工作從一個文件分解爲三部分。這只是一系列具有密集操作的120.000個元素。我創建了一個分割腳本,將數組存儲在每個大小爲40.000的數據庫中。然後我創建了一個帶有重定向到第一個PHP文件的HTML文件來計算第一個40.000元素。在計算完第一個40.000元素之後,我再次將HTML轉發到下一個PHP文件,依此類推。

不是很優雅,但它的工作:-)

0

如果您正在運行需要執行未知時間的腳本,你可以使用:

set_time_limit(0);

0

如果可能,您可以製作腳本以便處理所需操作的一部分。一旦它完成了10%,你通過AJAX再次調用腳本來執行下一個10%。但有些情況下這不是一個理想的解決方案,它取決於你在做什麼。

我用這種方法創建了一個基於網絡的爬蟲程序,它只能在我的電腦上運行。如果它必須立即執行操作,它也會超時。所以它被分成200個「任務」,一旦前一個完成,每個任務都通過Ajax調用。完美的工作,它已經運行了一年多(爬行?)

相關問題