PHPのエラー『Warning: Cannot Modify Header Information: Headers Already Sent』の解決方法

PHPで「Warning: Cannot modify header information – headers already sent」というエラーが発生する原因と解決方法について詳しく説明する。このエラーは、`header()` や `setcookie()` などのヘッダー操作を行う前に、すでに出力が開始されている場合に発生する。
目次
- 1. 1. エラーの発生条件
- 2. 2. エラーが発生するコード例
- 3. 3. 解決策1: `header()` を出力前に実行する
- 4. 4. 解決策2: `ob_start()` を使用する
- 5. 5. 解決策3: ファイルの余分な空白や改行を削除する
- 6. 6. 解決策4: `include` や `require` で読み込むファイルを確認する
- 7. 7. 解決策5: `setcookie()` や `session_start()` の実行タイミングを確認する
- 8. 8. 解決策6: BOM(Byte Order Mark)を削除する
- 9. 9. 解決策7: PHPのエラー出力を確認する
- 10. 10. 解決策8: `debug_backtrace()` を使って出力箇所を特定する
1. エラーの発生条件
このエラーは以下のような場合に発生する。
- HTMLや空白などが出力された後に `header()` を実行した場合
- PHPファイルの先頭または末尾に不要な空白や改行がある場合
- `include` や `require` で読み込んだファイルに余計な出力がある場合
- エンコーディングの問題でファイルに不要なバイトが含まれている場合
2. エラーが発生するコード例
以下のコードでは、HTMLの出力後に `header()` を実行しているため、エラーになる。
<?php
echo "ページを読み込んでいます...";
header("Location: https://example.com"); // エラー発生
?>
実行すると、以下のようなエラーが表示される。
Warning: Cannot modify header information - headers already sent by (output started at /path/to/script.php:2) in /path/to/script.php on line X
3. 解決策1: `header()` を出力前に実行する
`header()` はHTMLなどの出力が始まる前に実行する必要がある。
<?php
header("Location: https://example.com");
exit();
?>
4. 解決策2: `ob_start()` を使用する
出力バッファリングを有効にすると、出力内容がバッファに蓄積されるため、`header()` の実行前にエラーを防ぐことができる。
<?php
ob_start();
echo "ページを読み込んでいます...";
header("Location: https://example.com");
ob_end_flush();
?>
5. 解決策3: ファイルの余分な空白や改行を削除する
以下のような不要な空白があるとエラーの原因になる。
// エラーの原因(ファイルの先頭に空白がある)
<?php
header("Location: https://example.com");
?>
この場合、ファイルの先頭にある余分な空白を削除する。
<?php
header("Location: https://example.com");
?>
6. 解決策4: `include` や `require` で読み込むファイルを確認する
外部ファイルに不要な出力が含まれている場合、エラーの原因になる。
// includeするファイル(エラーが発生する例)
<?php
echo "ロード中...";
?>
// メインのスクリプト
<?php
include 'header.php'; // ここで出力が発生
header("Location: https://example.com"); // エラー発生
?>
解決策として、`header.php` に出力を含めないようにする。
// 修正後の header.php(不要な出力を削除)
<?php
// ヘッダー情報のみを含める
?>
7. 解決策5: `setcookie()` や `session_start()` の実行タイミングを確認する
`setcookie()` や `session_start()` もヘッダー操作を行うため、出力前に実行する必要がある。
<?php
echo "ログイン情報を設定中...";
setcookie("user", "JohnDoe", time() + 3600, "/"); // エラー発生
?>
// 修正後
<?php
setcookie("user", "JohnDoe", time() + 3600, "/");
echo "ログイン情報を設定しました";
?>
8. 解決策6: BOM(Byte Order Mark)を削除する
ファイルが UTF-8 BOM 付きで保存されていると、見えないバイトが先頭に挿入され、エラーの原因になる。エディタのエンコーディング設定で「UTF-8(BOMなし)」にする。
9. 解決策7: PHPのエラー出力を確認する
`php.ini` で `display_errors` を有効にし、エラーの発生箇所を特定する。
display_errors = On
error_reporting = E_ALL
10. 解決策8: `debug_backtrace()` を使って出力箇所を特定する
どこで出力が始まったかを確認するために `debug_backtrace()` を使用する。
<?php
if (headers_sent($file, $line)) {
echo "出力が開始されたファイル: $file (行: $line)";
}
?>
-
前の記事
Rubyのエラー『FloatDomainError: NaN』の解決方法 2025.04.17
-
次の記事
Vue warn: Error when rendering root nodeの解決方法 2025.04.17
コメントを書く