今天遇到個問題,php怎樣去檢測客戶端是否已經斷開鏈接呢? php
開始的時候覺得就用函數connection_aborted()或者connection_status()函數就能夠知道了, 瀏覽器
誰知道坑爹的沒反應. 服務器
後來經過測試和google找到了方法 函數
其實關鍵其實就在flush函數,由於php沒有經過刷新緩衝區和使用flush()的時候是整個文件輸出到客戶端內容的. 測試
當輸出到客戶端的時候實際上php已經運行完了. google
因此當使用flush()函數時候,php會立刻將輸出的內容發送到客戶端,但假如客戶端已經中斷鏈接的話,服務器就會知道客戶端已經停止鏈接了. spa
表達能力不是很好,有些錯或者看不懂的能夠告訴我,謝謝 code
下面是測試代碼: it
ob_start(); ignore_user_abort(TRUE);//容許php忽略用客戶端中斷 $fp = fopen('connection_test.txt','w+'); fwrite($fp, "start run\r\n"); for($i=0, $counter=10;$i<$counter;$i++){ if(connection_aborted()){ //提示若是客戶端斷開鏈接則在文件裏輸入提示並中止腳本 fwrite($fp, "user aborted the connection, connection_status return ".connection_status()."\r\nend run\r\n"); exit; }else{ //輸出並記錄當前狀態 fwrite($fp, $i." ".connection_status()." ".connection_aborted()." ".time()."\r\n"); echo $i." ".connection_status()." ".connection_aborted()." ".time()."\r\n"; //下面是刷新php緩衝區,並立刻向客戶端發送緩衝區內容 ob_flush();//刷新php緩衝區 flush();//全部輸出發送到用戶的瀏覽器 ob_end_flush(); } sleep(2);//ZZZzzzz..... } ob_end_clean(); fwrite($fp, "end run\r\n"); fclose($fp);