エラーコード辞典

🚨 php-headers-sent PHP Warning: Cannot modify header information - headers already sent

header() / session_start() / setcookie() の前に何か出力した

原因

BOM 付き UTF-8 / `<?php` 前後の空白・改行 / echo / require した別ファイルの末尾改行 等が原因で、HTTP ヘッダ送信時に既に本文が出力されている状態です。 PHP は最初の出力時にヘッダを確定して送信するため、 その後の `header()` 呼び出しは無効になります。

なぜ起きるか (内部仕組み)

HTTP の仕様上、 ヘッダはレスポンスボディの前に送らなければいけません。 PHP は本文出力が始まった瞬間にヘッダをロックします。 そこから後で `header("Location: /")` を呼んでも、 既にヘッダは送信済みなので変更不可、 という警告 + 動作不能 になります。

よくあるシナリオ

1. include した設定ファイル末尾に `?>` の後改行があり、 それが出力される。 2. UTF-8 BOM (= ファイル先頭の不可視 3 バイト) を保存してしまった (= メモ帳・Word からのコピペで混入)。 3. include 経由で読み込んだ HTML テンプレートが先に出力されている。 4. `echo` でデバッグ出力を残したまま session_start() を呼んだ。

対処方法

ファイル先頭の `<?php` の前に何もないこと、末尾の `?>` を省略すること、BOM なし UTF-8 で保存することを確認します。出力前に `ob_start();` を呼ぶ回避策もあります (= 出力バッファを使うとヘッダ送信を遅らせられる)。 エラーが出ているファイルと行は警告メッセージに含まれているので、 その箇所を最初に確認します。

再発防止 / 予防策

チーム規約として「PHP 専用ファイルは `?>` を書かない」 を徹底 + EditorConfig や Linter (= PHP_CodeSniffer) で BOM 検出を CI に組み込みます。