警告 セッションクッキーを送信できません - ヘッダーはすでに送信されています。
警告 セッションクッキーを送信できません - ヘッダーはすでに送信されています... 問題解決 (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に変更すれば完了です。
関連
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み] 非オブジェクトのメンバ関数bind_param()の呼び出し【重複
-
[解決済み] LaravelにおけるMassAssignmentException
-
[解決済み] サブアレイの値で配列をグループ化する
-
[解決済み] Laravel5でテーブルを切り捨てる
-
[解決済み] PHP 未定義のインデックスです。http_user_agent
-
[解決済み] wordpress プラグイン -> 未定義の関数 wp_get_current_user() へのコール
-
[解決済み] デプロイメント後にキャッシュを強制的にリフレッシュする
-
pclzip PHP の通知。正しく形成されていない数値が見つかりました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】警告: file_get_contents(): https:// ラッパーがサーバー構成ですべて無効になっています。
-
[解決済み] ログインした状態で未定義の関数mysql_query()を呼び出す [重複].
-
[解決済み] Paypal express checkout : システム的な10486エラー
-
[解決済み] PHPです。未定義の配列キーを処理する最速の方法
-
[解決済み] SQLSTATE[HY000] [2002] Laravelホームステッド内で接続が拒否されました。
-
[解決済み] localhost/laravel/public/post が見つかりません。
-
[解決済み] proc_open() の出力を取得する方法
-
[解決済み] 内蔵の mb_internal_encoding メソッドを呼び出すことができませんか?
-
[解決済み] Laravelの刃。デフォルトのパーシャルを降伏させることができるか