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

  • 作成日 2025.04.17
  • php
PHPのエラー『Warning: Cannot Modify Header Information: Headers Already Sent』の解決方法

PHPで「Warning: Cannot modify header information – headers already sent」というエラーが発生する原因と解決方法について詳しく説明する。このエラーは、`header()` や `setcookie()` などのヘッダー操作を行う前に、すでに出力が開始されている場合に発生する。

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)";
}
?>