2014-03-04 23 views
0

我嘗試將郵件發送給很多訂閱者。我需要長時間執行我的腳本,比max_execution_time允許的時間長得多。我可以使用Cron標籤,這將按計劃每次執行我的腳本,但是我可以在沒有cron選項卡的情況下執行嗎?我嘗試這樣:如何繞過PHP中的max_execution_time?

$maxTime = ini_get('max_execution_time'); 
    $startTime = time(); 
    foreach ($emails as $email) { 
     if (time() < $startTime + $maxTime - 2) { 
      // do something 
     } else { 
      // reload this page 
     } 
    } 

而且它的工作做好了,但如果我在瀏覽器標籤頁關閉這個頁面,它死了,不重裝。我提醒,我正在尋找這個的實施,沒有Cron標籤。我想手動啓動一次,稍後在後臺運行。

注:此外,我想指出,我不考慮服務器上的負載,並在此階段發送郵件可能區間!

+0

線程化PHP如何分割工作的限制內不會觸發您的託管強加的執行超時? – Prix

+0

我無法在託管時禁用max_execution_time。我現在有30秒的限制 –

+0

'set_time_limit(0);'使它永遠不會超時 – mic

回答

1

您有幾種選擇:

命令行 你最好的選擇是在命令行上手動運行此。命令行腳本對於運行長時間運行的進程要好得多。

殼牌Exec的 如果你必須通過瀏覽器運行此,您可以通過使用觸發命令行腳本execshell_exec('php -f /var/www/domain.com/myLongRunningProcess.php > /dev/null 2>/dev/null &')

忽略用戶中止 您還可以運行的東西瀏覽器已經取下之後,來自瀏覽器會話。這是最複雜和最難調試,但它會工作。您必須計算頁面的確切大小,然後發送輸出並使用函數ignore_user_abort,以便在瀏覽器脫離時腳本將繼續運行。

+0

我嘗試使用'ignore_user_abort(TRUE)',但是當我的腳本自動重新加載頁面時,腳本的執行停止( –

+0

也許只是得到一個便宜的vps – edmondscommerce

+0

是的,我在想它,但我不明白爲什麼執行()函數返回頁面重新加載後停止( –