flush()を呼び出すことで出力バッファをフラッシュし、処理途中で結果を出力することができます。PHP: flush - Manual
スクリプトが実行可能な時間は制限されており、この時間を超えるとスクリプトは強制的に終了させられます。この時間は既定で30秒であり、長時間の処理を実行するには注意が必要です。
制限時間を超えた際には、次のようなエラーが表示されます。
Fatal error: Maximum execution time of 30 seconds exceeded in C:\index.php on line 10
この制限はset_time_limit()によって、実行可能な秒数を設定することで回避できます。なおゼロ秒とすると時間の制限はなくなります。PHP: set_time_limit - Manual
void set_time_limit ( int $seconds )
なおこの関数を使用するには、セーフモードを無効にする必要があります。そのためにはPHP設定ファイル (php.ini) でsafe_mode = Offとします。
// 実行時間の制限を無効にする set_time_limit( 0 ); // echo str_repeat( ' ', 1024 ); $index = 0; while( TRUE ) { echo $index++; // 出力バッファの内容を送信する @ob_flush(); @flush(); // プログラムの実行を遅延させる sleep( 1 ); }
JavaScriptのコードを出力するようにすると、進捗を見やすく表示できます。
set_time_limit( 0 );
echo '<div id="progress"></div>';
echo str_repeat( ' ', 1024 );
$index = 0;
while( TRUE )
{
echo '<script type="text/javascript">';
echo 'document.getElementById( "progress" ).innerHTML = '.$index++;
echo '</script>';
@ob_flush();
@flush();
sleep( 1 );
}
<body>タグのonloadイベントでメッセージを表示するようにすれば、処理の終了を通知できます。
<body onload="alert( '処理を終了しました。' )">