PHP 8.4.0 RC4 available for testing

ignore_user_abort

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

ignore_user_abortクライアントの接続が切断された際にスクリプトの実行を終了するかどうかを設定する

説明

ignore_user_abort(?bool $enable = null): int

クライアントの接続が切断された際にスクリプトの実行を終了するかどうかを設定します。

PHP をコマンドラインスクリプトとして実行していて スクリプトを終了させずに tty が消えた場合は、 次に何かを書こうとしたときにスクリプトが終了します。これは enabletrue に設定されていても同じです。

パラメータ

enable

この値が指定されるか、null でない場合、この関数は ini 項目 ignore_user_abortenable の値を設定します。 省略した場合、この関数は前の設定をそのまま返し、何も変更しません。

戻り値

以前の設定を表す integer 値を返します。

変更履歴

バージョン 説明
8.0.0 enable は、nullable になりました。

例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);
}

// ここに到達したということは、while ループ内で
// 'break' が実行されたのでしょう

// ここで、ログを記録したりなどの必要な処理を行います
// これは、ブラウザに依存せずに行えます
?>

注意

PHP は、クライアントに情報を送信しない限り ユーザーが接続を切断したかどうかを検出できません。 単に echo 文を使っただけでは、情報が送信されたかどうかを保証できません。 flush() を参照ください。

参考

add a note

User Contributed Notes 4 notes

up
57
spiritual-coder at spiritual-coder dot com
18 years ago
If you want to simulate a crontask you must call this script once and it will keep running forever (during server uptime) in the background while "doing something" every specified seconds (= $interval):

<?php
ignore_user_abort
(1); // run script in background
set_time_limit(0); // run script forever
$interval=60*15; // do every 15 minutes...
do{
// add the script that has to be ran every 15 minutes here
// ...
sleep($interval); // wait 15 minutes
}while(true);
?>
up
29
lukas dot starecek at centrum dot cz
15 years ago
Comment from Anonymous is not 100% valid. Time from sleep function is not counted to execution time because sleep delays program execution (see http://www.php.net/manual/en/function.sleep.php and comments). We tested it and it's true. Try this:

<?php

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

?>

It means, that if the loop most of the time will be at sleep (and in this case it probably be), then this script may be active for months or years even if you set time limit to one day.
up
15
Anonymous
15 years ago
use the spiritual-coder's code below with exreme caution and do not use it unless you are an advanced user.

first of all, such a code with no bypass point can cause infinite loops and ghost threads in server. there must be a trick to break out the loop.

i.e. you can use if (file_exists(dirname(__FILE__)."stop.txt")) break; in the loop so if you create "stop.txt", she script will stop execution.

also if you use set_time_limit(86400); instead of set_time_limit(0); your script will stop after one day.
up
3
Micke
9 years ago
It seems that this function does not work for IIS servers.

A detailed description can be found on the PHP Bug Tracking System:
https://bugs.php.net/bug.php?id=60586#1378935714
To Top