PHPで標準で以下のような機能が実装されています。
- ブラウザとの接続が切れた場合(ブラウザの「中止」ボタンが押された場合や閉じられた場合)に処理を中断する
- ブラウザからのリクエストがあってから、30秒以上経過しても処理が終わらなければ中断する
これらの機能は、スクリプトにバグがある場合などで処理が終了できなくなった際の予防です。ですが仕事でPHPを使っている場合、どうしても処理を中断させたくない場合があります。
この場合、上記の2つの機能を無効にする必要があります。ただしタイムアウト時間を無限にした場合、本当に無限ループに入っている場合に終わらなくなってしまいますので、タイムアウト時間を十分に長いものに指定することをお勧めします。設定方法は以下のようになります。
【php.iniに設定する場合】
ignore_user_abort = On
max_execution_time = 86400
【.htaccessに設定する場合】
php_value ignore_user_abort On
php_value max_execution_time 86400
【プログラム中で設定する場合】
ignore_user_abort(1);
set_time_limit(86400);
ただし、PHPがセーフモードで動いている場合は効果がありません。また、ブラウザで処理に時間がかかるプログラムを呼び出した場合は、定期的に何かを出力していないとブラウザ側でタイムアウトしてしまう場合があります。(処理自体は最後まで実行されます)

ignore_user_abort(false)でPHPが処…
ユーザ側の切断で処理を続行すべきかどうかを調整する「ignore_user_abort()」関数がありますが、バッファ処理を行っていないと(ob_start())処理 (more…)
トラックバック by 作業日報 — 2008/4/5 @ 18:00:16
コメントいただきありがとうございました!
サイトも拝見させていただきました、
自分が嵌ったところも結構あり、目頭が熱くなる思いです(^^;
今後ともよろしくお願いいたします
コメント by ジョジョ — 2008/4/6 @ 1:38:30
[…] ある技術者の備忘録 » PHPの処理を中断させない方法 […]
ピンバック by Yuyak Blog - PHPは実行の途中でブラウザを閉じると、処理が中断されるのか? — 2009/12/15 @ 22:53:12
[…] 対策を調べたのでメモ。 http://www.meibinlab.jp/nishijima/archives/71 […]
ピンバック by CSVダウンロードがタイムアウトする場合 « cakePHP,Subversion,Ajaxのメモ — 2009/12/27 @ 6:22:02