2010-03-25 77 views
1

我用PHP編寫了一個需要很長時間才能執行[數千張圖片的圖像處理]的腳本。這是幾個小時計 - 也許5如何增加發生讀取超時錯誤的時間?

15分鐘處理後,我得到的錯誤:


ERROR 所請求的網址無法獲取

遇到下面的錯誤,而嘗試檢索的網址:我點擊

Read Timeout 

系統重新網址轉向:否錯誤]同時等待從網絡讀取數據時發生

超時。網絡或服務器可能已關閉或擁塞。請重試您的請求。

您的緩存管理員是網站管理員。


我需要的是啓用該腳本運行時間更長。

現在,這裏是所有的技術信息: 我正在寫在PHP和使用Zend框架。我正在使用Firefox。處理完成的長腳本在點擊鏈接後完成。顯然,由於腳本沒有結束,我看到鏈接所在的網頁,並且網絡瀏覽器寫入「正在等待......」。 15分鐘後發生錯誤。

我試圖更改Firefox的扔about:config中,但沒有成功。我不知道,但其他地方可能需要更改。

那麼,有什麼想法?

提前感謝。

回答

0

如果該過程運行幾個小時,那麼您應該考慮批處理。因此,您只需存儲圖像處理請求(在文件,數據庫或任何適合您的作品中),而不是啓動圖像處理。然後,這個請求被服務器上運行的預定(cron)進程拾取,該進程將執行實際的處理(這可以是調用set_time_limit(0)的PHP腳本)。處理完成後,您可以通過郵件或任何其他適合您的方式向用戶發出信號表明處理已完成。

1

的set_time_limit(0)將隻影響腳本的服務器端運行。您收到的錯誤純粹是瀏覽器端。您必須發送SOMETHING以防止瀏覽器判斷連接已經死亡 - 即使是輸出的單個字符(後面跟着flush()以確保它實際上通過線路發送)也可以。也許一次處理每個圖像,或在一個固定的時間間隔(if last char sent more than 5 minutes ago, output another one)。

如果你不想要任何中間輸出,你可以做ignore_user_abort(TRUE),這將允許腳本保持運行,即使連接從客戶端關閉。

+0

我試圖寫一個「。」每一分鐘,它確實寫了它,儘管腳本仍在運行。 但是15分鐘後腳本停了下來,剩下的頁面只剩下15個點。我嘗試使用ignore_user_abort(TRUE),但它沒有任何區別。腳本仍然沒有完成。 – Alex 2010-03-26 12:09:25

+0

可能是瀏覽器想要超過15個字節來考慮打開連接。奇怪的是,腳本在15分鐘後使用ignore_user_abort()停止。你確定沒有其他東西可以關閉嗎?也許是最大CPU限制? – 2010-03-27 01:58:48

0

批處理整個過程還具有額外的好處,即一旦出現問題,您不必重新開始整個過程​​。

如果您在自己的服務器上運行,並且可以脫離safe_mode,那麼您還可以分叉後臺進程來完成實際的繁重工作,而不管瀏覽器對事物的看法如何。如果您處於多核或多處理器環境中,您甚至可以隨時安排多個正在運行的進程。

我們爲大型計算腳本做了類似的事情;這些進程的同步發生在共享數據庫上---但幸運的是,它們的進程非常獨立,我們唯一需要看到的就是它們的完成或終止。

相關問題