PHPでは、出力バッファリングメカニズムを使用してスクリプトによって生成された出力をキャッシュし、スクリプトが実行されるまでブラウザに送信されません。これを行うには、2つの主な利点があります。
コンテンツが出力されたときに制御することができ、ページがレンダリングされたときに何らかの処理が実行されるようにすることができます。
場合によっては、パフォーマンスを向上させることができ、ブラウザとの相互作用の数を減らすことができます。
ob_flush()は、バッファの内容をクリアしない一方で、出力バッファの内容をブラウザーに送信する出力バッファー関数です。したがって、 ob_flush()を呼び出した後、バッファ内の内容はまだ保持されており、使用し続けることができます。
flush()は、システム出力バッファーを強制的に更新するために使用される関数です。すべてをブラウザに送信しようとしますが、 ob_flush()とは異なり、PHPの出力バッファーは含まれず、PHPの内部バッファーのみをフラッシュします。 Flush()が呼び出されると、PHPはバッファ内の内容をブラウザに押し込み、ユーザーがこのデータを見るのを待ちます。
ob_flush()およびflush()はブラウザに出力を送信できますが、それらの使用シナリオと効果は異なりますが、特定の違いは次のとおりです。
特性 | ob_flush() | フラッシュ() |
---|---|---|
行動の対象 | PHP出力バッファー | システム出力バッファー |
バッファをクリアするかどうか | バッファをクリアしないでください | バッファをクリアします |
有効にするために出力バッファリングに依存するかどうか | 出力バッファリングメカニズムに依存します | 出力バッファリングメカニズムへの依存性はありません |
一般的なシナリオ | 通常、 ob_start()で使用される出力バッファリング操作 | 長期にわたるスクリプトによく使用されるブラウザへの更新と出力を強制します |
ob_flush()は、PHP出力バッファーがオンになったときにバッファー内の内容をブラウザに送信するために使用され、バッファ自体がクリアされていません。
flush()は、バッファーコンテンツをブラウザに送信するシステムレベルの出力リフレッシュ機能であり、PHP出力バッファリングメカニズムが依存しない状況に適しています。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 出力バッファリングをオンにします</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"パート1データ出力,送信を待ちます..."</span></span><span>;
</span><span><span class="hljs-comment">// ブラウザにコンテンツを送信します,しかし、バッファは残ります</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"データ出力の2番目の部分,すぐにユーザーに表示します。"</span></span><span>;
</span><span><span class="hljs-comment">// スクリプトを終了します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
上記の例では、 ob_start()を有効にして、出力バッファリングメカニズムを有効にします。 ob_flush()はバッファ内のデータをブラウザに出力しますが、バッファーをクリアしないため、出力の2番目の部分はスクリプトが完了するまでバッファーを継続します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"データの処理を開始します..."</span></span><span>;
</span><span><span class="hljs-comment">// 出力バッファーを強制的に更新します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>();
</span><span><span class="hljs-comment">// 長期にわたるタスクをシミュレートします</span></span><span>
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"タスクの完了。"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
この例では、 Flush()を強制して出力バッファーを強制して、ブラウザが「データの処理開始...」のコンテンツをすぐに受信できるようにし、次の「タスクが完了します」。 2秒後に表示されます。この方法は、ユーザーがリアルタイムの進捗状況を知覚する必要があるシナリオに特に適しています。
長期にわたるスクリプト(ダウンロード、ファイル処理など)
完了するのに長い時間がかかるタスク(ファイルのアップロードやダウンロードなど)を実行している場合は、 ob_flush()とflush()を使用して、ユーザーに進行状況を感じ、ブラウザのタイムアウトを避けることができます。
リアルタイムデータプッシュ<br> たとえば、リアルタイムのデータ表示、チャットシステム、その他のシナリオでは、 Flush()を使用して、データをリアルタイムでユーザーのブラウザにプッシュできるようにし、ユーザーが遅延や空白ページを表示しないようにします。
ページレンダリング最適化<br> ページのレンダリングプロセス中に、 OB_FLUSH()とFlush()を組み合わせて使用すると、ユーザーはスクリプトの実行中にページコンテンツの一部を表示できるようになり、ユーザーエクスペリエンスが向上します。