PHP Conference Japan 2024

ignore_user_abort

(PHP 4, PHP 5, PHP 7, PHP 8)

ignore_user_abort設定客戶端斷線是否應中止腳本執行

說明

ignore_user_abort(?bool $enable = null): int

設定客戶端斷線是否應導致腳本中止。

當以命令列腳本方式執行 PHP 時,如果腳本的 tty 消失但腳本未終止,則腳本將在下一次嘗試寫入任何內容時停止,除非 enable 設為 true

參數

enable

如果設定且不為 null,這個函式會將 ignore_user_abort ini 設定設為指定的 enable 值。否則,這個函式只會回傳先前的設定而不會更改它。

回傳值

回傳先前的設定值,為一個整數。

更新日誌

版本 說明
8.0.0 enable 現在可以為 null。

範例

範例 #1 ignore_user_abort() 範例

<?php
// 忽略使用者中止並允許腳本
// 永久執行
ignore_user_abort(true);
set_time_limit(0);

echo
'測試 PHP 中的連線處理';

// 執行一個無意義的迴圈,有時
// 希望會讓我們點擊離開
// 頁面或點擊「停止」按鈕。
while(1)
{
// 連線是否失敗?
if(connection_status() != CONNECTION_NORMAL)
{
break;
}

// 睡眠 10 秒
sleep(10);
}

// 如果執行到這裡,則表示 'break'
// 已在 while 迴圈內觸發

// 所以我們可以在這裡記錄,或執行任何其他任務
// 我們需要做的,而不實際依賴
// 瀏覽器。
?>

注意事項

在嘗試將資訊傳送到客戶端之前,PHP 不會偵測到使用者已中止連線。僅僅使用 echo 陳述式並不能保證資訊已送出,請參考 flush()

參見

新增註釋

使用者貢獻的註釋 4 則註釋

spiritual-coder at spiritual-coder dot com
18 年前
如果您想要模擬 cron 作業,您必須呼叫這個腳本一次,它會在背景中永久執行(在伺服器正常運作期間),同時每隔指定秒數(= $interval)「執行某些動作」。

<?php
ignore_user_abort
(1); // 在背景執行腳本
set_time_limit(0); // 永久執行腳本
$interval=60*15; // 每 15 分鐘執行一次...
do{
// 在此處添加每 15 分鐘要執行的腳本
// ...
sleep($interval); // 等待 15 分鐘
}while(true);
?>
lukas dot starecek at centrum dot cz
15 年前
匿名用戶的評論並非完全正確。`sleep` 函式的時間不被計入執行時間,因為 `sleep` 會延遲程式執行(請參閱 https://php.dev.org.tw/manual/en/function.sleep.php 及其註釋)。我們測試過,這是真的。試試這個

<?php

set_time_limit
(2);
sleep(4);
echo
'hi!';
sleep(4);
echo
'bye bye!';

?>

這表示,如果迴圈大部分時間都在睡眠狀態(在這種情況下很可能如此),那麼即使您將時間限制設定為一天,此腳本也可能持續執行數月或數年。
匿名用戶
15 年前
使用以下 spiritual-coder 的程式碼時要格外小心,除非您是進階用戶,否則不要使用它。

首先,這種沒有跳出點的程式碼可能會導致伺服器上的無限迴圈和幽靈執行緒。必須要有個技巧來跳出迴圈。

例如,您可以在迴圈中使用 `if (file_exists(dirname(__FILE__)."stop.txt")) break;`,這樣如果您建立了 "stop.txt",腳本就會停止執行。

此外,如果您使用 `set_time_limit(86400);` 而不是 `set_time_limit(0);`,您的腳本將在一天后停止。
Micke
9 年前
此函式似乎不適用於 IIS 伺服器。

可以在 PHP Bug 追蹤系統中找到詳細說明
https://bugs.php.net/bug.php?id=60586#1378935714
To Top