在一個虛構的Web應用程序...當瀏覽器中的頁面加載被取消時,服務器中會發生什麼?
- 用戶點擊一個鏈接
- 服務器開始準備響應,但它需要幾秒鐘
- 用戶取消頁面加載
請求發生了什麼? 服務器是否繼續準備響應? 響應是否到達瀏覽器?
在一個虛構的Web應用程序...當瀏覽器中的頁面加載被取消時,服務器中會發生什麼?
請求發生了什麼? 服務器是否繼續準備響應? 響應是否到達瀏覽器?
服務器將繼續準備響應。當它試圖發送響應給客戶端時,它會失敗。實際發生的這可能取決於實際的應用服務器實現,響應是否被緩衝等。
在Java EE應用服務器(Tomcat和WebLogic,可能還有其他應用服務器)中,您將得到以下例外:
java.net.SocketException: Connection reset by peer: socket write error
我認爲實際的TCP連接被瀏覽器關閉,因此Web服務器將無法發送數據,除非它被專門編程爲在準備數據時檢測到斷開的連接,那麼該頁面將是即使用戶取消,也可以完全處理。
雖然我對這些東西知之甚少,但這是我的猜想。
PHP瞭解三種連接狀態:NORMAL,ABORTED和TIMEOUT。您可以使用ignore_user_abort()函數在ABORTED連接(默認情況下,腳本已終止)上更改PHP的策略。從筆記部分:
「PHP將不會檢測到用戶已中止連接,直到嘗試向客戶端發送信息。」
請注意,如果您的服務器的輸出被緩衝,發送可能不會立即發生。
查看PHP's page on connection handling瞭解更多詳情。
如果連接在請求完全發送到服務器之前中斷,則不會發生響應處理。
如果請求完全發送,則會觸發服務器端處理,儘管連接斷開,響應生成仍會繼續。
在ASP.NET中,通過使用Response.IsClientConnected可以檢測到此情況,以便在客戶端不再連接時停止處理,從而節省CPU時間並立即將線程返回到線程池。
是Apache或其他webrowser發送FIN/ACK到PHP? – 2012-10-30 12:55:53