2012-06-27 305 views
3

我正在研究可能涉及長時間運行任務的php腳本。這個過程就像這樣,一個用戶(在我的情況下使用iOS應用程序)將數據提交給我的Web服務。部分過程需要我的php腳本聯繫第三方來確認一些提交的數據。客戶端(在iPad上)不需要等待第三方的響應。PHP異步任務

僞代碼:

Pull values from _POST[] 
some simple validation 
if _POST[] values are good 
    return success to client 
    further process submitted data with thrd party 
    update database 
else 
    return error code and message 

它是如何將有可能從我的服務器返回一個簡單的JSON對象只充當收據,並有我的PHP腳本進一步處理提交的數據。我所使用的第三方已經知道響應速度很慢(做了幾次跳躍,並且已知需要幾分鐘才能做出響應)。

+0

你有控制服務器嗎? I.e .:你可以在web服務器上下文外運行一些東西嗎? –

+0

@EugenRieck我自己的開發服務器,是的,但可能不在他的生產服務器上。 –

回答

6

雖然你可以發送輸出緩衝區,並保持處理(見Continue processing after closing connection)這是一個哈克的解決方案,而不是適用於PHP的請求生命週期。

更好的方法是創建一個處理隊列。當客戶端訪問您的服務時,您返回成功狀態並在隊列中插入處理請求(例如,在數據庫表/鍵值存儲區等中)。一個單獨的進程(例如運行CLI腳本的cron作業)選擇任務並首先執行它們。這允許長時間運行的腳本在帶外執行 - 甚至可能在不同的服務器上執行。

另外,這還允許您釋放Web服務器以獲取更多請求,即使客戶端需要檢查長時間運行的進程的結果。客戶端可以輪詢服務器以檢查作業是否完成,並在準備就緒時獲得完整響應。