OB_CLEAN()関数は、PHPの出力バッファーをクリアします。この操作は、特にバッファ内のデータの量が多い場合、本質的に大量のデータ移動とメモリ内でクリアを実行します。 OB_CLEAN()が呼び出されるたびに、PHPはバッファー内の内容を破棄し、その後の出力操作のための新しいバッファーを準備する必要があります。
メモリの消費:バッファがクリアされると、PHPはメモリスペースを割り当てて新しいデータを保存します。メモリが頻繁にクリアされ、再割り当てされると、不必要なメモリオーバーヘッドが発生します。
CPU占有率:バッファーがクリアされるたびに、PHPはバッファーの内容を処理する必要があります。これにより、特に並行性シナリオが高いCPUの負担が増加し、システムパフォーマンスに影響します。
この頻繁なメモリとCPUの使用により、特に大規模なWebサイトやアプリケーションでプログラムが遅くなり、パフォーマンスの劣化がより明白になります。
ob_clean()への頻繁な呼び出しによって引き起こされるパフォーマンスの問題を回避するために、次の側面から最適化できます。
PHPはデフォルトで出力バッファリングを可能にします。つまり、すべての出力はすぐにブラウザに送信されず、最初にメモリに保存されます。スクリプトが実行されると、PHPは一度にバッファー内の内容をクライアントに送信します。
output_bufferingパラメーターを構成することにより、出力バッファーのサイズを制御できます。アプリケーションがバッファーを頻繁にクリーニングする必要がない場合は、バッファサイズを増やすことでOB_CLEAN()への呼び出し数を減らすことができます。たとえば、バッファサイズを大きくすると、バッファを頻繁にクリーニングする必要なく、スクリプト内のデータを処理する時間が増えます。
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'output_buffering'</span></span><span>, </span><span><span class="hljs-number">4096</span></span><span>); </span><span><span class="hljs-comment">// バッファーをに設定します4KB</span></span><span>
</span></span>
多くのシナリオでは、頻繁なバッファークリアランスを避けるために、出力のタイミングを制御する必要があります。 OB_CLEAN()の使用は、ページへの出力のタイミングを遅らせることで削減できます。
たとえば、すべてのページ処理を完了した後、バッファーコンテンツを均一に出力して、データが処理されるたびにバッファーのクリアを避けることができます。この方法では、パフォーマンスを大幅に改善できます。
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 出力バッファリングをオンにします</span></span><span>
</span><span><span class="hljs-comment">// データ処理を実行します,呼ばれていません ob_clean()</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"This is a test."</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>
いくつかの特定のビジネスロジックでは、出力バッファーをクリアする必要があります。ただし、 OB_CLEAN()が不適切なプログラミングのためだけに呼び出される場合、または間違ったロジックのために呼び出される場合、コードロジックを調整することで出力順序を回避できます。たとえば、不必要な清掃操作を避けるために、アプリケーションレベルで合理的な条件を作成します。
<span><span><span class="hljs-keyword">if</span></span><span> (condition_to_clean_buffer) {
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>();
}
</span></span>
場合によっては、バッファのコンテンツをすぐにブラウザに送信するだけで、バッファをクリアしない場合は、 flush()関数を使用できます。 flush()はバッファー内の内容をクライアントに送信しますが、バッファの内容をクリアしないため、メモリとCPUの消費が削減されます。
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 出力バッファリングをオンにします</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</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>
PHPは、 OB_END_CLEAN ()を使用してバッファーを完全にクリアして閉じるなど、 OB_CLEAN()よりも低レベルの出力制御メカニズムを提供したり、Bufferコンテンツを取得してクリアしたりします。これらの方法は、特定のシナリオでの出力バッファリングをより正確に制御でき、 ob_clean()への頻繁な呼び出しを回避できます。
<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">"Some content"</span></span><span>;
</span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ob_get_clean</span></span><span>(); </span><span><span class="hljs-comment">// バッファコンテンツを取得してクリアします</span></span><span>
</span><span><span class="hljs-comment">// さらなる操作 $content,バッファーのクリアを直接避けてください</span></span><span>
</span></span>