PHPプログラミングでは、ヘッダー関数を使用して生のHTTPヘッダーをクライアントに送信します。クライアントは通常、リダイレクト、コンテンツタイプの設定などに使用されます。ただし、開発中に、一般的なエラーが発生する可能性があります。通常、このエラーは、出力を送信した後にHeader()関数を使用しようとするときに発生します。
今日、このエラーの原因を掘り下げ、実用的なケースを使用して、 ob_start()を使用してそれを解決する方法を示します。
PHPでは、ページが何かを出力する前に、ヘッダー()関数を呼び出す必要があります。 Header()が何かを出力した後に呼び出された場合(HTMLタグ、スペース、エラーメッセージなど)、PHPはすでにエラーを送信するヘッダーをスローします。 PHPはHTTPヘッダーをブラウザに送信しようとしますが、すでにコンテンツ出力があるため、HTTPヘッダーを変更できず、エラーが発生します。
予期しないスペースまたはニューライン:最も一般的な理由は、ファイルの開始または終了に余分なスペースまたはニューラインがあることです。 PHPファイルの開始時または? >タグの終了後に< ? PHPタグの前に出力があります。これにより、PHPはHTTPヘッダーを自動的に送信します。
HTMLまたはその他の出力コンテンツ:PHPスクリプトがHTML、エコーステートメント、またはHeader()を呼び出す前にその他の非PHP出力を出力した場合、ヘッダーはすでにエラーを送信します。
一般的な解決策は、PHPの出力バッファー関数ob_start()を使用して、 Header()を呼び出す前にコンテンツの出力を避けることです。
別のページにリダイレクトしようとしているが、実行中にすでに送信されたエラーが既にエラーを送信している単純なPHPスクリプトがあるとします。
問題コード:
<?php
// ファイルの先頭に予期しないスペースまたはラインブレークがあると仮定します
echo "This is some content before the header.";
// リダイレクトを試してみてください
header("Location: http://m66.net/anotherpage.php");
exit();
?>
このコードを実行すると、ブラウザは次のエラーメッセージを表示する場合があります。
Warning: Cannot modify header information - headers already sent by (output started at /path/to/script.php:2) in /path/to/script.php on line 6
問題の理由は、エコーがコンテンツを出力し、HTTPヘッダーが送信されるためです。したがって、 Header()関数が呼び出されると、ヘッダーを変更できなくなります。
PHPの出力バッファー機能を使用して、この問題を解決できます。 OB_START()関数は出力バッファーを有効にします。そのため、コードに出力がある場合でも、PHPは最初にスクリプトが実行されるか、 OB_END_FLUSH()が呼び出されるまでバッファーにコンテンツを保存します。
解決済みコード:
<?php
// 出力バッファーをオンにします
ob_start();
// ファイルの先頭に予期しないスペースまたはラインブレークがあると仮定します
echo "This is some content before the header.";
// リダイレクトを試してみてください
header("Location: http://m66.net/anotherpage.php");
exit();
// 出力バッファーを終了し、すべてを送信します
ob_end_flush();
?>
この変更されたコードでは、 ob_start()を有効にします。エコーがコンテンツを出力したとしても、コンテンツはすぐにブラウザに送信されるのではなく、スクリプトが実行されるまでバッファーでキャッシュされます。 Header()関数を呼び出すと、PHPはHTTPヘッダーを変更して、ヘッダーが既に送信されたエラーを回避できます。
ob_start()および出力バッファーを使用することにより、 header()関数を呼び出すときに「既に送信されたヘッダー」エラーを回避できます。このアプローチは、特に他の出力(インポートされたファイルやサードパーティライブラリなど)を制御できない場合、実際の開発で非常に役立ちます。
この種のエラーが発生した場合は、問題を解決するためにコードの先頭にOB_START()を追加してみてください。シンプルで効果的なソリューションです。