首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 偵測用戶關閉瀏覽器連線:connection_status 與 register_shutdown_function 實作

     編輯:PHP 綜合知識

核心機制

PHP 提供 connection_status() 回傳連線狀態位元組合:

  • 0 (NORMAL):正常
  • 1 (ABORTED):用戶點擊停止/關閉瀏覽器
  • 2 (TIMEOUT):執行超時
  • 3 (ABORTED | TIMEOUT):兩者皆發生

關鍵前提:腳本必須有輸出並 flush(),否則無法觸發 ABORTED 偵測。

範例一:主動輪詢偵測

<?php
echo str_repeat(" ", 3000); // 填滿輸出緩衝區,確保 flush 生效
ignore_user_abort(true);    // 即使用戶中斷,腳本仍繼續執行

mylog('online');

while (true) {
    echo "test<br>\n";
    flush();                // 強制輸出到瀏覽器
    sleep(1);

    if (connection_status() != 0) {
        mylog('offline');
        die('end the script');
    }
}

function mylog($str) {
    $fp = fopen('e:/abort.txt', 'a');
    $str = date('Y-m-d H:i:s') . $str . "\r\n";
    fwrite($fp, $str);
    fclose($fp);
}

關鍵點解析

  1. str_repeat(" ", 3000):填充緩衝區,繞過 Web Server (如 Nginx/Apache) 的輸出緩衝
  2. ignore_user_abort(true):預設用戶中斷會終止腳本,設為 true 可讓腳本繼續執行完善清理工作
  3. flush():將 PHP 緩衝區資料推送到 Web Server,觸發網路傳輸,才能偵測連線中斷
  4. 日誌記錄雙狀態:上線/離線時間

範例二:關閉腳本時自動執行 (Shutdown Function)

<?php
function foo() {
    $s = 'connection_status ' . connection_status();
    mylog($s);
}
register_shutdown_function('foo');  // 腳本結束或 exit() 時自動呼叫

set_time_limit(10);
for ($i = 0; $i < 10000000; $i++) {
    echo $i;
}

function mylog($str) {
    $fp = fopen('e:/abort.txt', 'a');
    $str = date('Y-m-d H:i:s') . $str . "\r\n";
    fwrite($fp, $str);
    fclose($fp);
}

適用場景

  • 記錄腳本結束時的連線狀態 (正常/中斷/超時)
  • 執行清理工作:釋放鎖、關閉連線、寫入審計日誌
  • 不需主動輪詢,由 PHP 內核在請求結束階段自動觸發

兩種方法比較

特性connection_status() 輪詢register_shutdown_function
偵測時機執行期間即時請求結束階段
需 ignore_user_abort是 (否則中斷即終止)否
需輸出+flush是否
適用場景長時間任務、即時監控清理工作、統計記錄
可中斷腳本執行是否 (僅事後處理)

實務建議

  1. 長時間任務:使用 ignore_user_abort(true) + 定期 flush() + connection_status() 檢查
  2. 關鍵業務:配合資料庫交易、鎖機制,確保中斷時資料一致性
  3. 日誌記錄:建議使用系統日誌或專用日誌庫,避免檔案鎖競爭
  4. 現代替代方案:WebSocket / Server-Sent Events 可更精確掌握客戶端狀態

相關專題

  • 《PHP 基本語法入門教程》
  • 《PHP 錯誤與異常處理方法總結》
  • 《PHP 常用函數與技巧總結》
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved