処理途中で結果を出力

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

出力バッファ (output buffer)

出力バッファの制御関数の比較
区分 関数 送信
(フラッシュ)
消去
(クリア)
取得 破棄
flush ob_flush × ×
ob_end_flush ×
ob_get_flush
clean ob_clean × × ×
ob_end_clean × ×
ob_get_clean ×
contents ob_get_contents × × ×
PHP: 出力制御 - Manual

上書きするように出力

前述の方法では追記する形で出力するため、多数の出力をした場合には表示をスクロールする必要が生じます。これを先の出力を上書きするように出力するには、次のように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>';