簡體   English   中英

需要從瀏覽器運行一個很長的PHP腳本

[英]Need to run a long php script from a browser

我創建了一個腳本,從一些Web服務和我們的數據庫中獲取數據,格式化報告,然后將其拉鏈並使其可供下載。 當我第一次啟動時,我創建了一個命令行腳本來查看輸出結果,以及在瀏覽器中查看時獲得的腳本超時限制。 但是因為我不希望我的用戶必須從命令行使用它或者必須在他們的計算機上運行php,所以我想從我們的網絡服務器上運行它。

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

這是在Windows Server 2007上。

您應該在不同的進程中運行它。 創建一個持續運行的守護進程,命中數據庫並查找標志,如“ShouldProcessData”。 然后,當您點擊該網站時,將標志切換為true。 您的守護進程將在下一次迭代中看到該標志並開始處理。 將結果粘貼到數據庫中。 使用數據庫作為網站和長時間運行過程之間的通信機制。

在PHP中,您必須告訴您的流程需要多長時間

參見PHP手冊set_time_limit()

您可能還有另一個問題:瀏覽器本身超時(可能大約1~2分鍾)。 雖然該超時應該可以在瀏覽器中更改(對於每個瀏覽器),但通常可以通過每隔20秒向瀏覽器發送一些數據來阻止超時用戶端(例如下載的標題,你然后可以發送其他標頭,如編碼等...)。

Gearman非常方便(創建后台任務,讓javascript輪詢進度)。 它當然需要安裝齒輪裝置和工人。 見: http//www.php.net/gearman

為什么不從要提供下載的頁面進行ajax調用,然后等待ajax調用返回,另一頁等待set_time_limit(0)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM