PHPプログラミングでは、 OB_CLEAN()は一般的な出力バッファー管理機能です。その目的は、電流出力バッファーをクリアすることですが、バッファーコンテンツを出力しないことです。多くの開発者は、OB_CLEAN()を使用する場合、キャッシュの失業の問題に遭遇します。この現象は開発者を混乱させる可能性がありますが、この関数が呼び出された後でも、バッファーコンテンツがまだ存在するのはなぜですか?
この記事では、 OB_CLEAN()の仕組みに飛び込み、失業を引き起こす可能性のある一般的な誤解を分析し、いくつかの実用的なソリューションを提供します。
PHPでは、出力バッファリングメカニズムにより、出力データ(HTML、テキスト、エラーメッセージなど)をブラウザに直接送信するのではなく、メモリバッファーに一時的に保存できます。このメカニズムの利点は、スクリプトの実行中に出力を変更したり、特定の条件下で出力がブラウザに送信されたときに制御できることです。
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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// バッファをクリアします</span></span><span>
</span><span><span class="hljs-comment">// ここには何も出力されません,バッファがクリアされているため</span></span><span>
</span></span>
OB_CLEAN()は、現在アクティブな出力バッファーのみをクリアすることに注意する必要があります。アクティブバッファがない場合、または呼び出しが呼び出されたときにデータがバッファーされない場合、効果はありません。
OB_CLEAN()はドキュメントで明確に定義されていますが、実際に使用して、開発者はしばしば次の誤解に遭遇します。これにより、キャッシュがクリアされていないと信じるようになります。
OB_START()が最初に呼び出されて出力バッファリングメカニズムを開始しない場合、 OB_CLEAN()を呼び出すことは効果がありません。 PHPでは、 OB_CLEAN()は、出力バッファーが開始された後にのみバッファーをクリアできます。
<span><span><span class="hljs-comment">// エラーデモンストレーション:未出力バッファリングを開始します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// ここには効果はありません,バッファがないからです</span></span><span>
</span></span>
それを行う正しい方法は次のとおりです。
<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__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 这里才会バッファをクリアします</span></span><span>
</span></span>
PHPは、ネストされた出力バッファリングをサポートします。 OB_CLEAN()が呼び出されたときに正しいバッファのネスト構造が処理されない場合、クリアされると予想されるバッファーではなく、間違ったバッファーがクリアされる可能性があります。 PHPの出力バッファーはスタックベースであるため、 OB_END_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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"First output"</span></span><span>;
</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">"Second output"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 2番目のバッファのみがクリアされます,最初のものをクリアしません</span></span><span>
</span><span><span class="hljs-comment">// 電話する必要があります ob_end_clean() 最も外側のバッファをクリアする</span></span><span>
</span></span>
出力バッファがブラウザに送信された場合、 ob_clean()は送信コンテンツをクリアできません。 PHPは、バッファコンテンツが準備ができているときに自動的にブラウザに送信され、出力がトリガーされます。これは通常、 flush()が呼び出された場合、またはスクリプトが自動的に終了する場合に発生します。
<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">"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><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// この時点で呼び出されました ob_clean() 無効,コンテンツが送信されたためです</span></span><span>
</span></span>
解決策は、バッファーの内容が早すぎないか、出力が出力されている場合にクリアする代わりに、 OB_END_CLEAN()で出力バッファーを直接終了することを避けることです。
ob_start()でバッファコンテンツを処理するコールバック関数を提供すると、 ob_clean()によってクリアされるものは、コールバックによって処理されるコンテンツになります。コールバック関数内にエラーまたは論理的な問題がある場合、バッファがクリアされていないと考える可能性があります。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">custom_callback</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$buffer</span></span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$buffer</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-string">"custom_callback"</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__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// バッファをクリアします,しかし、コールバック関数のため,コンテンツが変更された可能性があります</span></span><span>
</span></span>
PHP(Opcache、データベースクエリキャッシュなど)には他にも多くの種類のキャッシュメカニズムがあり、出力バッファリングとは関係ありません。したがって、 OB_CLEAN()は、他のタイプのキャッシュに影響を与えることなく、PHPの出力バッファーのみをクリアします。
上記の誤解を避けるために、開発者は次のベストプラクティスに従う必要があります。
出力バッファーが正しく開始されていることを確認してください。OB_CLEAN ()を呼び出す前に、最初に出力バッファーを起動してください。
バッファスタック構造を理解する:ネストされたバッファーを使用する場合は、最も正しいバッファーをクリアするか、 OB_END_CLEAN()を使用してトップレベルのバッファーをクリアしてください。
事前にコンテンツの出力を避けないでください。OB_CLEAN ()またはOB_END_CLEAN()を呼び出す前に、バッファのコンテンツを出力しないでください。
コールバック関数を確認します:カスタム出力バッファ処理機能を使用する場合、そのロジックが正しく、 OB_CLEAN()の効果を妨げないことを確認してください。
これらの詳細を理解することにより、PHP出力バッファリングをより効果的に管理し、キャッシュの空きと無効化を防ぐことができます。