2010-09-23 82 views
3

我創建了一個腳本,它從一些Web服務和我們的數據庫獲取數據,格式化報告,然後將其壓縮並使其可供下載。當我第一次開始時,我使用命令行腳本來查看輸出,並避開在瀏覽器中查看時的腳本超時限制。但是因爲我不希望我的用戶必須從命令行使用它,或者必須在他們的計算機上運行php,所以我想從我們的web服務器運行該代碼。需要從瀏覽器運行一個長的PHP腳本

因爲這個腳本可能需要幾分鐘才能運行,所以我需要一種方法讓它在後臺處理,然後在文件成功創建後開始下載。在不觸發超時的情況下讓腳本運行的最佳方式是什麼?我曾嘗試過(使用反引號單獨運行腳本等),但放棄了,所以我在這裏問。理想情況下,用戶可以單擊表單上的提交按鈕來啓動請求,然後返回到頁面而不是讓他們盯着空白的瀏覽器窗口。當它們存在的zip文件(意味着進程已經完成)時,它應該通知它們(通過AJAX?重新加載的頁面?我還不知道)。

這是在Windows Server 2007上。

+0

set_time_limit(0); ignore_user_abort(真); header('Location:'。$ _ SERVER ['SCRIPT_NAME']); - 這不應該在理論上起作用嗎?它似乎仍然在等待頁面。這裏的想法是讓腳本運行,但發送用戶回到上一頁,以便在文件存在時由ajax通知。 – Chris 2010-09-23 17:11:41

+0

克里斯我假設可以工作,但它也會在高負載下殺死你的服務器! – Alfred 2010-09-23 18:34:26

+0

好的,我現在已經把它變成了一個工作表。使用set_time_limit(0)和ajax請求,它會在後臺運行。 – Chris 2010-09-23 19:22:03

回答

1

您應該在不同的過程中運行它。建立一個連續運行的守護進程,命中一個數據庫並尋找一個標誌,比如「ShouldProcessData」。然後,當您打開該網站時,將該標誌切換爲真。守護進程會在下一次迭代中看到標誌並開始處理。將結果粘貼到數據庫中。使用數據庫作爲網站與長時間運行過程之間的溝通機制。

0

Gearman非常方便(創建後臺任務,讓javascript輪詢進度)。它當然需要安裝工人創建工人&。請參閱:http://www.php.net/gearman

+0

雖然這可能是一個不錯的選擇,但我不想花時間安裝,配置和學習如何使用它。我正在尋找一個更簡單的解決方案,因爲這不是任何東西的主要組成部分,只是另一名員工的節省時間的腳本。 – Chris 2010-09-23 16:21:53

+0

就我個人而言,儘管您的里程可能會有所不同,但我已將它從聽到它的聲音建立起來並運行到實際部署適合生產(工人,工作和所有人)的完成過程。它本質上是@ just_in_case的解決方案,只有_less_爲你工作。 – Wrikken 2010-09-23 17:15:05

0

爲什麼不從您想要提供下載的頁面發出ajax調用,然後等待ajax調用返回並在另一頁上調用set_time_limit(0)。

+0

你用過這個嗎?這將允許它運行,只要它需要?因爲這是一個相當簡單的選擇,如果它。 – Chris 2010-09-23 16:25:05

1

在PHP中,你必須告訴你,你什麼時候出你的過程

PHP manual set_time_limit()

您可能有另一個問題:超時瀏覽器本身的(可能約爲1〜2分鐘)。雖然在瀏覽器(對於每個瀏覽器)中的超時應該是可以改變的,但是通常可以通過例如每20秒向瀏覽器發送一些數據來觸發超時用戶側的觸發(例如下載頭,你然後可以發送其他標題,如編碼等...)。

相關問題