2012-06-29 88 views
0

首先,我不是在尋找ignore_user_abort。 相反,我尋找一個函數來完成輸出並將文檔發送給用戶。在那之後,我想讓php腳本做額外的過程,這需要花費一秒鐘,而不會對用戶產生影響,只有後臺進程。PHP:輸出完成後繼續

用戶也沒有理由等待它完成。產出已經準備好趕上。 PHP是否提供了關閉與用戶的連接的功能,但在服務器上保留一段時間以完成工作?

+0

聽起來像延遲作業處理。谷歌那。 – keymone

+0

我相信你可以在這裏找到答案: http://stackoverflow.com/questions/124462/asynchronous-php-calls –

回答

1

php-fpm的最佳功能之一你是fastcgi_finish_requests()。這將完成客戶端的會話並在服務器端繼續進程。 對於通過cron進行的queque或延遲處理來說,它也是消息傳遞的最佳用例。

但是,它僅限於php-fpm!

0

你應該把你的工作分成2個文件(一個是初始化處理,產生輸出),另一個重要的需要幾秒鐘的時間,但不應該讓用戶等到完成。

然後,讓瀏覽器用Ajax或隱藏的iframe調用它。

您甚至可以讓第二個腳本返回成功/失敗通知,並通過JavaScript捕獲該通知以通知用戶,而不影響其實際的初始輸出。

+0

這可能是一個解決方案,但因爲我在廣告服務器上運行這個,負載將是巨大的,昂貴的,即使第二個文件的輸出是空的,這意味着每個實際請求(file1)有2個請求(和工作進程)。如果我的服務器目前可以每秒處理3000個呼叫,那麼這個額外的流量會將性能降低約50%:-(其他的解決方案不需要額外的調用?) – ledy

+0

還有另外一種選擇是特定於實現的,對於PHP-FPM,您可以使用'fastcgi_finish_request() '同時允許處理繼續 – Leigh

0

看起來像你想要的是一些AJAX的東西。 如果您將響應發回給用戶,腳本將結束。 但使用JavaScript,你可以開始一個Ajax調用另一個PHP腳本,不會改變任何用戶。

+0

與真理的建議相同的缺點:-( – ledy

0

您可以嘗試使用curl();來ping本地主機並觸發另一個腳本執行來運行您擁有的任何額外任務。

+0

與真理的建議相同的缺點:-( – ledy

0

腳本運行後,將一個條目添加到隊列表中。然後運行一個cron作業來處理隊列,鎖定記錄,然後在處理它們時刪除它們,所以如果你的cron重疊,他們不會做同樣的工作兩次。

+0

即它不能在發送輸出時發送_instantly_?所有數據當輸出被髮送時,它在最後一行的高速緩存中,當通過cron加載或稍後加載時,在完成最後一步之前必須讀取或再次加載所有信息。 – ledy