PHPで開発をしていると、時折遭遇する厄介なエラーの1つが「Warning: Cannot modify header information - headers already sent」です。このエラーは一見難解に思えますが、適切な理解と対策を行えば簡単に解決できます。この記事では、このエラーの意味を解説し、効果的な解決方法をご紹介します。

エラーの意味を理解する

「Warning: Cannot modify header information - headers already sent」というエラーメッセージは、PHPがHTTPヘッダーを送信しようとした際に、既にブラウザにデータが送信されていることを示しています。

PHPスクリプトの実行において、HTTPヘッダーは出力(echo文やHTML)よりも先に送信される必要があります。しかし、何らかの理由でスクリプトが出力を行った後にヘッダーを変更しようとすると、このエラーが発生します。

一般的な原因

  1. スクリプトの先頭に余分な空白や改行がある
  2. UTF-8 BOMが含まれている
  3. セッション開始(session_start())や、リダイレクト(header()関数)の前に出力がある
  4. インクルードしているファイルに余分な空白や出力がある

解決方法

1. スクリプトの先頭をチェック

PHPの開始タグ <?php の前に空白や改行がないか確認します。ファイルの先頭が以下のようになっているか確認しましょう:

<?php
// PHPコードはここから始まります

2. UTF-8 BOMを削除

テキストエディタでファイルを開き、UTF-8(BOMなし)で保存し直します。多くの現代的なエディタにはこのオプションがあります。

3. 出力前にヘッダー操作を行う

セッション開始やリダイレクトなどのヘッダー操作は、必ず出力よりも前に行うようにします:

<?php
session_start(); // セッション開始
// ここでヘッダー操作を行う
// ...

// その後で出力を行う
echo "Hello, World!";

4. インクルードファイルをチェック

require_once や include_once で読み込んでいるファイルにも、余分な空白や出力がないか確認します。

5. 出力バッファリングを使用する

問題の完全な解決が難しい場合、出力バッファリングを使用することで一時的に対処できます:

<?php
ob_start(); // 出力バッファリングを開始

// ここに通常のPHPコードを記述

ob_end_flush(); // バッファをフラッシュし、出力バッファリングをオフにする

まとめ

「Warning: Cannot modify header information - headers already sent」エラーは、PHPの出力とヘッダー送信のタイミングに関する問題です。スクリプトの構造を見直し、適切な順序でコードを実行することで、このエラーを解決できます。

開発中は常にこのエラーに注意を払い、クリーンなコードを心がけることが重要です。エラーメッセージをよく読み、問題の箇所を特定することで、効率的にデバッグを行えるでしょう。

PHPの開発において、このエラーの理解と解決方法を身につけることは、より堅牢なウェブアプリケーションを作成する上で非常に有益です。