PHP で session_start() のエラーが出たときの対応方法


[初回公開] 2011年04月08日

PHP にはセッション(session_start)と呼ばれる機能があり情報を他のコンテンツ(ページ)にも引き継ぐことができ、例えばログイン機能がある Web アプリケーションであればログイン済みであることをコンテンツ間で共有することが可能なのだが、正常に動作しない場合は session_start() のエラーが出ることがあるのでその原因と対応について紹介する。

PHPで session_start() のエラーが出たときの対応方法




1.session_start() に関するエラー内容


session_start() に関するエラーの例として次の内容が挙げられる。
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /ソースパス/実行PHPファイル名.php) in /ソースパス/クラスPHPファイル.php on line **


エラー内容で指摘されるプログラムの行数目(on line ** の箇所)には「session_start()」を記述しており、session_start() が正常に使えていないことを示している。

2.原因(1) ファイルの先頭に改行がある


一つ目に考えられる原因としては、実行する PHP のファイルの先頭に改行がないかを確認し、あれば改行を削除する。
session_start() は不要な文字列があるとセッションが働かないことがあり、特に冒頭に改行があると動作しないことがある。
もし実行する PHP が他の PHP などライブラリやモジュールも読み込んでいる場合は、それらも冒頭に改行が無いかを確認するとよい。

3.原因(2) UTF-8 の BOM 有りになっている


二つ目に考えられる原因としては、実行する PHP のファイルの形式が UTF-8 の BOM 有りになっていないかを確認し、BOM 有りであれば無しに変更する。
BOM 有りか BOM 無しかは Windows に初期インストールされている「メモ帳」などでは確認できないので、BOM が確認できるテキストエディタを利用する必要がある。

4.原因(3) output_buffering が OFF になっている


三つ目に考えられる原因としては、PHP の動作そもそもを定義している php.ini 内にある「output_buffering」が Off(無効)になっていないか確認し、Off であれば 4096 などバッファを指定する数値を記述する。
数値の代わりに On(有効)にするだけでもよい。
「output_buffering」はセッションの出力にも影響しており、これを有効にしないと session_start() はエラーになる。
ただし、PHP が利用できてもレンタルサーバやホスティングでは php.ini を変更できるのはサーバ管理者に限られるため、利用しているサーバの運営会社等に問い合わせる必要がある。
尚、「output_buffering」は PHP が他のコンテンツ(ページ)へのリダイレクトする際にも影響するため、On にすることで影響が出ないかは確認するとともに、リダイレクトと使い分けたい場合は「.htaccess」でも指定可能なのでディレクトリごとに設置するとよい。

5.原因(4) セッションディレクトリに権限が無い


最後に考えられる原因としては、Web サーバを Apache ではなく Nginx など他の Web サーバを利用している場合、サーバ側がセッションファイルを保持するディレクトリ(例:/var/lib/php/session)の所有者が apache:apache になっていることがあり、この所有者を nginx:nginx に変更する。
これは yum でインストールする PHP が apache を前提に配布されているのが要因で、所有者を nginx にしても PHP のアップデートや関連するライブラリをインストールして依存関係でセッション保持ディレクトリの所有者が自動的に apache になることがあるので注意が必要である。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 7

なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)

この記事へのコメント

この記事へのトラックバック