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);
}
str_repeat(" ", 3000):填充緩衝區,繞過 Web Server (如 Nginx/Apache) 的輸出緩衝ignore_user_abort(true):預設用戶中斷會終止腳本,設為 true 可讓腳本繼續執行完善清理工作flush():將 PHP 緩衝區資料推送到 Web Server,觸發網路傳輸,才能偵測連線中斷<?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);
}
| 特性 | connection_status() 輪詢 | register_shutdown_function |
|---|---|---|
| 偵測時機 | 執行期間即時 | 請求結束階段 |
| 需 ignore_user_abort | 是 (否則中斷即終止) | 否 |
| 需輸出+flush | 是 | 否 |
| 適用場景 | 長時間任務、即時監控 | 清理工作、統計記錄 |
| 可中斷腳本執行 | 是 | 否 (僅事後處理) |
ignore_user_abort(true) + 定期 flush() + connection_status() 檢查