2010-05-14 81 views
7

例如,FastCGI服務器對PHP腳本強制執行時間限制,PHP腳本無法使用set_time_limit()在PHP中進行更改。我相信IIS也這樣做。PHP:在服務器施加執行時間限制時對長時間運行的腳本進行編碼

我爲一個PHP應用程序編寫了一個導入腳本,該腳本在mod_php下運行良好,但在FastCGI(mod_fcgid)下失敗,因爲該腳本在數秒後終止。我還不知道在這種情況下檢測你的時間限制的方法,還沒有決定我怎麼去解決它。以小塊進行重定向看起來像是一團糟,但是怎麼樣?

在編寫長時間運行的任務(如導入或導出任務)時,您會使用哪些技術,其中個別PHP腳本可能會在某個秒數後由服務器終止?

請假設您正在創建一個可移植的腳本,因此您不一定知道PHP是否最終將在mod_php,FastCGI或IIS下運行,或者是否在服務器級別執行最大執行時間。這可能也會排除shell腳本等。

回答

4

使用PHP command line interface,它不受腳本Web服務器施加的時間限制。如果你需要自動執行你的腳本,你可以使用cron來安排它。

+4

使用cron的+1。長時間運行的任務不應該使用web腳本運行 – 2010-05-14 03:24:40

+0

我不明白如何推回php.ini中聲明的時間限制,你可以更具體嗎?謝謝 – Benoit 2010-05-14 07:00:22

+0

@Benoit我指的是服務器(Apache,IIS等)或服務器模塊(FastCGI/fcgid)施加的時間限制。從命令行運行時,您不會有這些特定的限制,並且唯一的限制將是PHP本身控制的限制。從命令行運行的缺點是它不便於移植 - 您必須爲Windows服務器設置不同的設置,或者根據PHP可執行文件的路徑進行更改等。但仍然是一種選擇。 – thomasrutter 2010-05-14 07:03:49

-1

你真正在談論的是工作排隊。這是從前端請求異步運行PHP代碼的做法。在PHP中有兩種主要的方法。一個是使用一個名爲Gearman的程序,另一個是使用我個人更熟悉的Zend Server Job Queue。我有一篇關於如何做到這一點的博客帖子,名爲Do you Queue。我發現我在那裏的實現非常容易使用。

您可能還想嘗試的是在執行邏輯之前將max_execution_time設置爲0。

-1

這樣做的小塊與重定向似乎是一個kludge,但如何?

這就是我究竟是如何處理的全論壇的數據庫備份(phpBB的)時,內置的導出機制開始打了極限max_execution_time僅僅。

我一次只做了一個表格,而對於5000行的大塊表格,我做了一次。 (事實證明,整個過程中的限制因素並不是導出時的執行時間,而是實際上phpmyadmin可以在導入時處理的文件大小。)

在每個導出塊後,我都返回了一頁在標題中使用元刷新標記,使用下一個塊的表號和查詢字符串中的開始行重定向腳本。

<?php if(!$all_done){ 
    $new_url=$_SERVER['PHP_SELF'].'?tablecount='.$count; 
    if(!$tabledone && ""!=$start_row && null!=$start_row){ 
     $new_url.="&startrow=".$start_row; 
    } else { 
     $new_url.="&startrow=0"; 
    } 
    echo('<meta http-equiv="refresh" content="0.5;url='.$new_url.'" />'); 
} ?> 

這些計數器讓我可以遍歷我用SHOW TABLES檢索的表名數組。

在我有機會從導出中剔除巨大的單詞匹配表(phpBB可以自行重建)之前,這個備份腳本需要半個多小時才能完成。