2017-09-13 70 views
0

我必須做很多處理的服務器結束後,但不希望用戶能夠意識到這一點。我想立即向用戶發送響應,然後在服務器端運行該進程。PHP與AJAX - 繼續處理髮送響應用戶

我做了一些研究,到目前爲止,我已經做到了這一點:

function process(){ 
    ignore_user_abort(true); 
    set_time_limit(0); 

    ob_start(); 
    // Send response to the user 
    header('Connection: close'); 
    header('Content-Length: '.ob_get_length()); 
    ob_end_flush(); 
    ob_flush(); 
    flush(); 

    // Post process 

} 

據我所知,這應該立即返回用戶反應,然後運行後的進程。但它不起作用:它仍然在等待所有的過程完成。

Bytheway,我發送一個AJAX請求,如果它有幫助。起初我認爲這可能是會話鎖定問題,但現在我甚至沒有使用任何會話(session_status()返回1)。

PHP版本是7.1

注:我讀過,其中上面的方法能正常工作等相關問題,但由於某種原因,它不是在我的情況下工作。

+1

更好的設計是將這種脫機數據處理轉移到另一個處理,例如,由cron作業定期觸發的腳本。例如,面向用戶的腳本只會將任務的細節和任何必要的數據寫入數據庫表中,並且cron作業腳本會在表中查找新任務,並使用所提供的信息運行它們。這樣在UI上就沒有依賴關係了。 – ADyson

+0

@ADyson感謝您的信息。上面的函數應該可以工作。但是由於使用Cron Job需要對數據庫進行一些重大修改(這對我來說是一個痛苦,因爲我正在免費進行此項目),所以我會等待一個解決方案。但如果我沒有得到解決辦法,我將別無選擇,只能忍受痛苦。 –

+1

據我所知輸出刷新不適用於ajax。您設置用於處理響應的回調只有在看到響應完成時纔會運行。每次獲得部分響應時都不能重複運行(即使已發送要發送的所有輸出,也不要忘記,直到PHP腳本完成後纔會向客戶端發送最終響應) - 你必須以不同的方式編寫回調代碼以應對這種情況,而且我從來沒有見過這樣的事情的實現。 – ADyson

回答

0

它看起來像(如@ADyson中的評論稱)沖洗輸出似乎不工作,AJAX。所以,解決這個問題的唯一辦法是使用Cron Job。爲此,我使用PHP Cron Scheduler。但是可以直接使用crontab將Cron作業添加到列表中。

我加入了後期處理到另一個PHP文件用合適的變化,以便它可以從腳本執行相同的任務,並添加文件到調度。

該解決方案似乎是一個真正的痛苦,但沒有解決比使用定時任務等這個問題。