我正在通過ajax調用php腳本來執行一些數據庫維護。如果用戶關閉頁面,點擊返回或點擊鏈接,PHP腳本是否會完全執行?有沒有辦法做到這一點?如果用戶在AJAX請求結束之前退出瀏覽器或更改頁面會發生什麼
也許如果PHP腳本調用exec()
方法或類似的東西,這將依次調用通過控制檯的腳本這樣:
$ php /var/www/httpdocs/maintenance.php
?
我正在通過ajax調用php腳本來執行一些數據庫維護。如果用戶關閉頁面,點擊返回或點擊鏈接,PHP腳本是否會完全執行?有沒有辦法做到這一點?如果用戶在AJAX請求結束之前退出瀏覽器或更改頁面會發生什麼
也許如果PHP腳本調用exec()
方法或類似的東西,這將依次調用通過控制檯的腳本這樣:
$ php /var/www/httpdocs/maintenance.php
?
只要用戶代理(瀏覽器等)已完全發送請求,服務器就擁有了它所需的全部內容,並將完成請求並嘗試發回響應。
實際上,這種「ping」行爲通常用於保持服務溫暖或執行定期維護的「心跳」過程。
一旦網絡請求將其發送到您的服務器,用戶關閉瀏覽器或導航時真的無關緊要。您的服務器仍然會響應,但沒有人會收聽響應。
這是一個競爭條件。 PHP會在某個時刻檢測到(通常是在嘗試執行輸出時),Apache正在大聲說出遠程用戶已關閉連接。你想做的所有事情都是在這個時候完成的,這取決於你的代碼的結構。
如果要在腳本自行關閉之前確保所有操作都已完成,請使用ignore_user_abort(TRUE)
,這樣可以在連接斷開後保持PHP運行。它仍然受到用戶的max_execution_time限制以及什麼,但它不會因爲斷開連接而關閉。
因此,如果Apache檢測到遠程連接已關閉,PHP腳本可能在執行完成之前暫停? – 2012-01-18 20:12:10
哈哈哈,我發現發佈後的功能,試圖取消我的問題,並自己回答,但我還沒有足夠高的聲望。以下是我想寫的東西,對不起,讓每個人都在搜尋錯誤的東西的時候失去了時間: ** 好吧,仍然不知道AJAX到底發生了什麼,但我發現了一種方法來防止PHP腳本終止,如果用戶用函數中斷php腳本: ignore_user_abort() http://php.net/manual/en/function.ignore-user-abort.php 我應該從頭開始研究PHP,而不是AJAX,我馬上發現它。 ** – NaturalBornCamper 2012-01-18 20:16:47
可以,但不必。還有其他因素在起作用,但理論上是這樣的,用戶可以(例如)在商店的庫存更新之後但在處理付款之前按下ESC完成電子商務結賬過程。 – 2012-01-18 20:18:59
一旦ajax呼叫被啓動,用戶可以自由地做他們想做的任何事情。如果他們關閉了頁面,他們根本無法從ajax調用中獲得反饋(如果有的話)。
如果php開始執行,那麼無論用戶關閉窗口還是從頁面導航,它都將繼續執行。
無論瀏覽器狀態如何,php腳本都會完成。 php在服務器上解析,並不關心客戶端是否仍然打開。
如果HTTP請求已完成,那麼是的,即使客戶端的計算機關閉,PHP腳本也會完全執行。
因設置,Web服務器,操作系統等而異。
通常情況下,請求將像往常一樣進行處理,並且響應將永遠不會被讀取。偶爾,寫入可能會更早失敗,並且處理時請求失敗。
有沒有辦法避免這種情況? – 2016-09-26 09:34:01
@SushantBajracharya您可以在調用時使用設置爲「1」的變量,並且如果用戶在變量爲「1」時嘗試重定向,他們會收到一條消息,告訴他們他們不能。呼叫完成後,它會回到「0」並允許重定向。 – 2017-07-12 16:58:33