1. ホーム
  2. php

警告 セッションクッキーを送信できません - ヘッダーはすでに送信されています。

2022-02-20 02:58:38

警告 セッションクッキーを送信できません - ヘッダーはすでに送信されています... 問題解決 (PHPのUTF-8 BOMが原因)

phpのプログラミングはedit plusに慣れているので、たまに不明なエラーがあって困ります。
最近、あるプロジェクトの開発中に、一部のページで以下の問題が必ず発生するようになりました。

Warning: session_start() [function.session-start]: セッションクッキーを送信できません - ヘッダーは既に送信されました (出力は E:/web/Apache2/htdocs/ index.php:1 で開始) in E:/web/Apache2/htdocs/functions/sessions.php on line 67

警告: session_start() [function.session-start]: セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています (出力は E:/web/Apache2/ htdocs/index.php:1 で開始) in E:/web/Apache2/htdocs/functions/sessions.php on line 67
詳しく調べた結果、以下のような理由が判明しました。
私のエディットプラスでは、デフォルトエンコーディングをutf-8に設定しており、UTF_8の署名は、: always add signature.となっています。
そこで、以下を試してみてください。
edit plus Tools->Parameters->File->UTF_8 Signatures で、オプション "Always add signature" を "Always remove signature" に変更して、index.phpファイルを開いて別名保存し直し、スクリプトを再実行すると、ようやく動きました。

また、ウェブ上でさらに2つの有益な記事を見つけたので、この状況に遭遇した人には完璧なものになることを期待します


UTF-8 BOMに起因するPHPの奇妙な問題 2007-06-30 14:29 I.

//--a.php
<?php
header("Content-Type: image/BMP");
session_start()を使用します。
................
? >
a.php を utf-8 形式で保存すると、この php ファイルにブラウザでアクセスした場合、以下のようなエラーが発生します。
Warning: session_start() [function.session-start]: セッションキャッシュリミッターを送信できません - ヘッダはすでに送信されています (出力開始

at ×××.php:1) in ××× on line 2.

これは非常によくある問題で、ほとんどの場合、session_startの前に出力があるためです 古参の方は基本的にこのエラーは起きないのですが、DWやeditplusなどを使っている場合。

DWやeditplusのようなエディタでコードを書いていると、エキスパートでもこのエラーになることがあるんだ!

上で促されたように:xxxxxファイルの1行目、xxxxxファイルの2行目、ご覧のように、この2箇所には出力文はないでしょう、それでもエラーがあるのは不思議です、なぜでしょう?
元はといえば

Unicode署名(BOM)は、文書内のバイトオーダーマーカー(BOM)を含むことができます。BOMは、テキストファイルの先頭にある2~4バイトで、そのファイルがUnicodeであることを識別し、もし、これが

この場合、後続のバイトのバイトオーダーも特定する。UTF-16とUTF-32では必須です。
See! このオプションを選択すると、ページ上部に2〜4バイト出力されます!

また、session_start() は、事前にクライアントのブラウザに出力する必要はありません。


II.

もう一つ、例えば、エラーが発生する可能性のある場所があります。
/--a.php--
? >
空白行
空白行

また、a.phpをインクルードして、その後に戻ってきた場合にもこの問題が発生します。通常のアドバイスとしては、?

別の例
Session_Start()が呼ばれる前に出力があることはありえません。例えば、次のようなものは間違っています。
のエラーになります。
==========================================
1行
2行<?PHP
3行目 Session_Start();//以前は1行目に出力がありました。
4行目 ......
5行ですか! >
==========================================

検証してみたところ、確かに事実はとても奇異です。
3つです。

session_start()
set_cookie()
header()
両方を@で囲むと、この警告は表示されなくなります。


IV.

editplusエディタでは、まずa.phpファイルをutf-8からgb2312などに変換し、正常にアクセスできるようにutf-8に変換すると、つまりファイルの先頭が

BOMが取り除かれ、BOMのないUTF-8になりました。


PHP - utf-8 エンコーディングの問題による session_start() エラー

2007-02-15 14:55:01

大・小
デフォルトの gb2312 エンコーディングが使用されている場合、Ansi エンコーディングと互換性があり、ファイルヘッダに追加情報がないため、この時点で session_start() は正常に動作することができます。
utfエンコーディングの場合、ほとんどのエディタはファイルヘッダにBOMブロックを付加しますが、私のEditPlusの付加はFF FEで、hexエディタを使用しています。
よくわかると思います。このように、session_start()が呼ばれたとき、実際には2バイトがブラウザに出力されますが、それは見えない文字です
ブラウザに次のような警告が表示されます。
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at .............................).

回避策
1、手動でBOMブロックを削除する、あなたはUltraEditなどの16進エディタで編集することができ、またはエディタ独自の機能を使用して、良いエディタは、通常、BOMブロックを削除するかどうかのオプションを提供します。
2、独自のスクリプトを書いて修正する、これは異なるエディタ、BOMヘッダ定義用です。
UTF-8 EF BB BF
UTF-16 ビッグエンディアン FE FF
UTF-16 リトルエンディアン FF FE
UTF-32 ビッグエンディアン 00 00 FE FF
UTF-32 リトルエンディアン FF FE 00 00

解決方法

PHPのセッション操作をするときに、もし表示されたら。Warning: Cannot send session cookie - headers already sent..." or "Cannot add header information - headers already sent..." or "Cannot add header information - headers already sent..."

php.iniでOutput_bufferingを設定するだけです。デフォルトはnoなので、これを1に変更すれば完了です。