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設定ファイルでsafe_mode = Off
とします。
// 実行時間の制限を無効にする set_time_limit( 0 ); // 最初から結果が出力されるように、多数の空白を出力する ※1 echo str_repeat( ' ', 1024 ); $index = 0; while( TRUE ) { echo $index++; // 出力バッファの内容を送信する @ob_flush(); @flush(); // プログラムの実行を遅延させる sleep( 1 ); }
※1 ブラウザによってはバッファがたまるまで表示を待つため、最初から表示されるようにするには、事前にその分の出力を済ませておく必要があります。PHP: flush - Manual
区分 | 関数 | 送信 (フラッシュ) |
消去 (クリア) |
取得 | 破棄 |
---|---|---|---|---|---|
flush | ob_flush | ○ | ○ | × | × |
ob_end_flush | ○ | ○ | × | ○ | |
ob_get_flush | ○ | ○ | ○ | ○ | |
clean | ob_clean | × | ○ | × | × |
ob_end_clean | × | ○ | × | ○ | |
ob_get_clean | × | ○ | ○ | ○ | |
contents | ob_get_contents | × | × | ○ | × |
前述の方法では追記する形で出力するため、多数の出力をした場合には表示をスクロールする必要が生じます。これを先の出力を上書きするように出力するには、次のようにJavaScriptのコードを出力します。
set_time_limit( 0 ); echo '<div id="progress"></div>'; echo str_repeat( ' ', 1024 ); for( $index = 0; $index < 10; $index++ ) { echo "<script>document.getElementById( 'progress' ).innerHTML = '{$index}'</script>"; @ob_flush(); @flush(); sleep( 1 ); }
body要素のonloadイベントでメッセージを表示するようにすれば、処理の終了を通知できます。
<body onload="alert( '処理を終了しました。' )">
もしくはscript要素を出力するようにすれば、任意のタイミングで通知できます。
echo '<script>alert( "TEST" )</script>';