PHPで開発をしていると、時折遭遇する厄介なエラーの1つが「Warning: Cannot modify header information - headers already sent」です。このエラーは一見難解に思えますが、適切な理解と対策を行えば簡単に解決できます。この記事では、このエラーの意味を解説し、効果的な解決方法をご紹介します。
エラーの意味を理解する
「Warning: Cannot modify header information - headers already sent」というエラーメッセージは、PHPがHTTPヘッダーを送信しようとした際に、既にブラウザにデータが送信されていることを示しています。
PHPスクリプトの実行において、HTTPヘッダーは出力(echo文やHTML)よりも先に送信される必要があります。しかし、何らかの理由でスクリプトが出力を行った後にヘッダーを変更しようとすると、このエラーが発生します。
一般的な原因
- スクリプトの先頭に余分な空白や改行がある
- UTF-8 BOMが含まれている
- セッション開始(session_start())や、リダイレクト(header()関数)の前に出力がある
- インクルードしているファイルに余分な空白や出力がある
解決方法
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の開発において、このエラーの理解と解決方法を身につけることは、より堅牢なウェブアプリケーションを作成する上で非常に有益です。