2009 年 8 月
« 7 月   9 月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

最近のコメント

    PHP-よくあるエラーメッセージと対策-(その7)

    今までPHPでプログラミングを行ってきて、頻繁に出会ったエラーメッセージとその対策を説明したいと思います。

     

    Warning: session_start(): Cannot send session cache limiter - headers already sent in エラーが発生しているPHPファイルのフルパス on line エラーが発生している行

     

    セッションIDの格納にCookieを利用する設定となっており、

    session_start関数の呼び出しより先にブラウザに対してレスポンスが出力されている場合、上記エラーが発生します。

    これは、cookieを利用する為にHTTP通信のレスポンスヘッダにSet-Cookieヘッダを埋め込むのですが、

    既にブラウザに対してレスポンスが出力されている為、

    レスポンスヘッダを変更する事が出来ない状態(HTTP通信の仕様)になってしまい、エラーが発生します。

    対策としては、ソースコードの先頭でsession_start関数を呼び出すようにする。

    または、session_start関数より先にレスポンスを出力している処理の順序を変更する事で対応できます。

    また、PHPにはレスポンスをすぐ出力せずに一時的に蓄えておく(出力バッファリング)機能がありますので、

    こちらを有効にする方法でも、エラーを解消する事ができます。

    もし、プログラムの処理順序がどうしても変更できない場合は、出力バッファリング機能を利用すれば対応できると思います。

    ※出力バッファリング機能の有効化は、php.iniのoutput_bufferingディレクティブにOnを指定します。
     また、ob_start関数を呼び出して、出力バッファリングを有効化する事もできます。

    あと、同じようなエラーで以下のエラーメッセージが出力される場合があります。

     

    Warning: Cannot modify header information - headers already sent by (output started at 出力を開始しているPHPファイル:出力を開始している行) in エラーが発生しているPHPファイルのフルパス on line エラーが発生している行

     

    こちらも原因は、ブラウザへのレスポンスを出力した後にレスポンスヘッダを操作しようとした場合に発生します。

    よくある例としては、以下のような事があると思います。

    • header関数を呼び出す前にprint関数などの出力処理を実行している。
    • set-cookie関数を呼び出す前に print関数などの出力処理を実行している。
    • 「<? php」の前に半角スペースが入力されている。
    • PHPのエラーメッセージが先に出力されている。(エラーメッセージの表示を有効にしている場合)
    • include関数、require関数で読み込むPHPファイルの最後の「?>」に半角スペースが入力されている。

     こちらも処理の順序の変更か、出力バッファリング機能を有効で対応できると思います。

     あと、意外とハマるのがPHPのソースコードをUTF-8で作成した時。

    BOM付きの文字コードで編集した場合、

    ソースコードの先頭にエディタで見えないBOM(Byte Order Mark)が埋め込まれている為、

    BOMがいきなりレスポンスとして出力されます。

    この場合、いくらソースコードの先頭でsession_start関数を呼び出しても、エラーメッセージが出力されますので、

    文字コードをUTF-8のBOM無しに変更してください。

    Comments are closed.