という出力をそのループ内のブラウザに書き込もうとすると、接続が終了した場合にスクリプトが異常終了することがわかります。この動作は、コマンドラインスクリプトとしてPHPを実行している場合ignore_user_abort
のドキュメントでを示唆し、スクリプトのTTYは、スクリプトは、それが書き込もうと 次の時間が死んでしまうスクリプトが終了されることなく、離れ を移行します値がTRUE
に設定されていないものは、私はいくつかの実験を自分で試してみました、そしてあなたには、いくつかのブラウザの出力をしようとしない場合でも、出力バッファがまだ満杯でない場合、スクリプトは動作し続けますことを見出しました。出力バッファリングをオフにすると、出力が試行されるとスクリプトは中止されます。これは理にかなっています。SAPIレイヤーは、出力を送信しようとしたときに要求が終了したことを認識する必要があります。ここで
はアボートをトリガ何実証例...
//ensure we're not ignoring aborts..
ignore_user_abort(false);
//find out how big the output buffer is
$buffersize=max(1, ini_get('output_buffering'));
while (true)
{
sleep(1);
//ensure we fill the output buffer - if the user has aborted, then the script
//will get aborted here
echo str_repeat('*', $buffersize)."\n";
file_put_contents('/tmp/foo' , "I'm alive ".getmypid()."\n" , FILE_APPEND);
}
です。出力なしの無限ループに入る可能性のあるスクリプトがある場合は、connection_aborted()を使用して、接続がまだ開いているかどうかをテストできます。
クライアントへの出力を一切行わずにユーザーの中止を無視しています。 – hakre