PHP開発では、 OB_CLEAN()関数を使用して出力バッファーコンテンツをクリアします。これは、デバッグとパフォーマンスの最適化に非常に一般的です。ただし、場合によっては、次のエラーメッセージが発生します。
<span><span><span class="hljs-built_in">Warning</span></span><span>: Cannot modify </span><span><span class="hljs-keyword">header</span></span><span> information - headers already sent </span><span><span class="hljs-keyword">by</span></span><span> (output started at /</span><span><span class="hljs-type">path</span></span><span>/</span><span><span class="hljs-keyword">to</span></span><span>/script.php:xx) </span><span><span class="hljs-keyword">in</span></span><span> /</span><span><span class="hljs-type">path</span></span><span>/</span><span><span class="hljs-keyword">to</span></span><span>/script.php </span><span><span class="hljs-keyword">on</span></span><span> </span><span><span class="hljs-type">line</span></span><span> xx
</span></span>
このエラープロンプトは、ob_clean()を呼び出してバッファーをクリアしても、phpはまだHTTPヘッダー情報を変更できないことを示しています。これは、PHPが出力(HTML、スペース、またはエラーメッセージなどを含む)を送信すると、HTTPヘッダー情報も自動的に送信されるためです。 HTTPヘッダー情報は出力コンテンツの前に送信する必要があるため、出力が開始された場合、PHPは新しいヘッダー情報を変更または送信できません。
HTTPヘッダー情報は、HTTPリクエストと応答で渡される重要なメタデータです。たとえば、Cookieの設定、他のページにジャンプする、またはページのキャッシュ制御などはすべて、HTTPヘッダー情報を通じて達成されます。
PHPは、HTTPヘッダー情報を変更または追加するヘッダー()関数を提供します。ただし、この関数への呼び出しは、出力コンテンツの前に実行する必要があります。そうしないと、上記の「ヘッダー送信」エラーが発生します。
OB_CLEAN()関数は、出力バッファーの内容をクリアするために使用されるPHP出力バッファリング関数の一部です。通常、このアプローチは、出力を事前に送信し、大量の出力データを処理する際に後続のヘッダー設定に影響を与えることを避けることができます。
ただし、 OB_CLEAN()を呼び出した後、ブラウザに送信されたコンテンツには影響しません。 OB_CLEAN()を呼び出す前に出力が送信された場合、ヘッダー情報を変更できません。
通常、「HTTPヘッダーが送信される」エラーにはいくつかの理由があります。
PHPは、スクリプトが開始または前にコンテンツを出力します(たとえば、HTMLタグ、スペース、エラーメッセージなど)。
エコーまたは印刷機能を使用して、コンテンツを事前に出力しました。
PHPスクリプトの前後に余分な空白またはラインブレークがあります。
HTML出力であろうとテキスト出力の種類であろうと、PHPはHTTPヘッダーを自動的に送信するため、出力後にヘッダーの変更を行うことはできません。
Header()関数を呼び出す前に、PHPスクリプトを確認して、出力がないことを確認してください。出力には次のものが含まれます。
HTMLタグ
エコーまたは印刷機能の内容
未処理のエラーメッセージ
スクリプトが開始される前に、Whitespace文字または線が壊れます(ファイルの開始前後や閉じたタグの前後のスペースなど)
出力バッファリングの問題を回避するために、スクリプトの先頭にob_start()に電話することができます。これを行うと、PHPがすべての出力コンテンツをバッファリングし、スクリプトの最後に一度に出力を送信し、HTTPヘッダーの送信エラーを回避できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Location: https://www.example.com'</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-title function_ invoke__">ob_end_flush</span></span><span>(); </span><span><span class="hljs-comment">// 出力バッファーの内容</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
OB_CLEAN()と同様に、 OB_END_CLEAN()は現在のバッファの内容をクリアし、バッファを閉じます。これにより、バッファのコンテンツがクライアントに送信されるのを防ぎ、その後のHTTPヘッダー設定が影響を受けないようにします。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: text/html; charset=UTF-8'</span></span><span>);
</span><span><span class="hljs-comment">// バッファをクリアして閉じます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_clean</span></span><span>();
</span><span><span class="hljs-comment">// スクリプトの処理を続けます</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
エラーが続く場合は、すべての出力ソースを探すことで問題を見つけることができます。 Header()関数を呼び出す前に、スクリプトに予期しない出力がないことを確認してください。デバッグモード、ロギング、その他の手段でトラブルシューティングを支援できます。
OB_CLEAN()は、出力バッファーをクリアするときに「ヘッダー送信」エラーを防ぐのに非常に効果的です。ただし、これはブラウザに送信されていないコンテンツに対してのみ機能します。 Header()を呼び出す前にPHPが出力を送信した場合でも、エラーは発生します。これらの問題は、スクリプトの先頭にob_start()を呼び出して、出力バッファリングを有効にし、事前にコンテンツ出力がないことを確認することにより、効果的に回避できます。
PHPの出力バッファリングメカニズムを理解して正しく使用すると、HTTPヘッダーと出力コンテンツをより適切に管理し、より堅牢で効率的なPHPプログラムを作成できます。