長時間実行によるブラウザタイムアウト対策

PHPで長時間実行されるバッチ処理で起こる問題。

PHPではサーバー負荷防止のための “max_execution_time” によるタイムアウトがあるが、これとは別にブラウザに画面出力がないまま時間が経過すると、408 Request Timeout が発生してしまう。

タイムアウトまでの時間は、Firefoxではdefaultで115秒、IEでは60秒となっている。
 

これを防ぐためには、画面に何か定期的に出力しておく必要がある。
バッチ処理の場合は、リアルタイムに処理件数等をカウントしていくプログレスバーを表示する方法がある。

実現方法としてはAjaxを用いる。具体的にはこちらを参考にした。

はじめに全体の処理件数を求める。
ループ処理の最後で処理件数をカウントアップしていき、「処理件数 / 全体件数 * 100」 でプログレスバーのゲージを進める。

これで3分を超える処理でも 408 Request Timeout は起こらなくなった。