「Warning: Cannot modify header information…」エラーの解決方法[PHP]
PHPで「header()」関数を使用したら「Warning: Cannot modify header information – headers already sent by ・・・」とかいう見慣れないエラーが表示されたので解決方法を紹介します。
まえがき
phpで外部のページに飛ばしたい時とかに重宝する「header(“Location:○○”)」ですが、この前この関数を使用した時に「Warning: Cannot modify header information – headers already sent by ・・・」という見たことのないエラーが表示されました。
「header(“Location:○○”)」でエラーなんて出たことなかったので焦りましたが解決したので覚え書きです。
「Warning: Cannot modify header information・・・」エラーの原因
「Warning: Cannot modify header information・・・」エラーは考えられる原因が2つあります。
原因1「header()」関数の前に出力や改行
KoToRiはまさにこれが原因でした。
「header()」関数を使用する際は全ての画面上への出力の前に実行する必要があります。
言葉だと分かりにくいので例を挙げていきましょう。
まずKoToRiの原因を例に挙げてみます。
//←改行が入っちゃってる <?php header('Location: http://www.example.com/'); ?>
「header()」関数実行前に改行やスペースが入ってしまうと「Warning: Cannot modify header information・・・」エラーが出てしまいます。
また「header()」関数実行前に「echo()」とかで画面に何かしら出力する処理をしてもダメです。例えばこのコードだと「Warning: Cannot modify header information・・・」エラーがでます。
<?php echo 'これだとエラーが出るよ'; header('Location: http://www.example.com/'); ?>
「echo()」の例だと順番を変えればエラーは出ません。
<?php header('Location: http://www.example.com/'); echo 'これだとエラーは出ないよ'; ?>
こういう系はうっかりミスでやりがちなので気を付けましょう。
原因2 「php.ini」の「output_buffering」の設定
原因1を修正しても解決しなかった場合、「php.ini」の「output_buffering」の設定を変更すると解決するかもしれません。
output_buffering = Off
を
output_buffering = On
に設定を変更してみましょう。
この「output_buffering」という設定項目は「header()」「setcookie()」以外の実際に出力される部分(httpレスポンスボディ)をバッファリングするかどうかです。
つまり「output_buffering = On」を設定すれば実際に出力される部分(httpレスポンスボディ)がバッファリングされます。
となると「output_buffering = On」を設定すれば
「header()」関数の実行前に「echo()」や改行が入っていてもエラーが出ません
例えばログイン機能でcookieを使用する際などの「header()」や「setcookie()」の実行前に出力的な処理を行いたい場合は非常に重宝するでしょう。
PHPマニュアルの出力制御の説明ページのリンク貼っときます。
出力制御
まとめ
最初はただの素人ミス「不要な改行が入っていた」のが原因だったというところから、この記事を書くために色々調べていくと最終的に「output_buffering」の機能にまで発展し「output_buffering = On」を設定すれば「header()」関数の実行前に「echo()」や改行が入っていてもエラーが出ないというところまで辿り着きました!
ブログを書くということは奥深いですね。特にこういう技術系ブログに関しては自分の知識的にもいい効果が生まれていると実感できます。
という本題と関係のない話は置いといて今日はこれだけ覚えて帰ってください。
「output_buffering = On」を設定すれば「header()」関数の実行前に「echo()」や改行が入っていてもエラーが出ません
Pingback: momoco no blog()