PHP のセッション処理でエラーになる
SERVER
PHP のバージョンアップを行った際に、PHP のセッション処理でエラーが発生してしまうようになりました。
それについて考えられる原因と、その対応方法について調べてみました。
PHP のアップデート後に phpMyAdmin がエラーになる
MySQL を管理するための phpMyAdmin ページへアクセスした場合に、次のエラーが表示される場合がありました。
エラーが出たためセッションを開始できませんでした。PHP やウェブサーバのログファイルに出ているエラーを確認して、PHP を正しく設定してください。
その時の Apache エラーログを確認すると、次のような形でエラーの内容を確認することができました。
[client xxx.xxx.xxx.xxx] PHP Warning: session_start(): open(/var/lib/php/session/sess_XXXXXXXX, O_RDWR) failed: Permission denied (13) in /usr/share/phpMyAdmin/libraries/session.inc.php on line 86
[client xxx.xxx.xxx.xxx] PHP Warning: Unknown(): open(/var/lib/php/session/sess_XXXXXXXX, O_RDWR) failed: Permission denied (13) in Unknown on line 0
[client xxx.xxx.xxx.xxx] PHP Warning: Unknown(): Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0
今回の場合はどうやら、PHP のセッション情報を格納するためのディレクトリー "/var/lib/php/session" のパーミッションとして 777 (drwxrwxrwx) が設定されている PHP 環境で、PHP のアップデートを行ったことが原因のようでした。
PHP がバージョンアップされたときに "/var/lib/php/session" のパーミッションが 775 (drwxrwx---) に変更されたような感じで、それにより、セッションを利用する PHP ページを表示しようとしたときに、そのディレクトリーにセッション情報を書き込むことができなくなり、エラーが発生していた様子です。
このディレクトリーには、通常は apache 権限で書き込めるように設定されているのですけど、実効権限周りを調整している場合、例えば mod_ruid を利用しているような場合には、既定の設定では書き込めなくなる場合があります。
今回も mod_ruid によって実効権限の変更が行われていたため、次のように権限をアップデート前の状態に戻すことで対応しました。
chmod 777 /usr/lib/php/session
ただ、おそらくは PHP をアップデートしたときに設定される権限の方が安全のように思うので、可能であれば Apache での実行権限を調整するなど、何らかの方法で、PHP セッション情報を保存するためのディレクトリーに 775 権限でも書き込めるように調整するのが良いかもしれません。
mod_ruid を利用している場合は Apache の RUidGid や RGroups の設定を見直して、セッション情報を格納するディレクトリーへの書き込みがそのアカウントで行えるように調整できるか検討するのも良いでしょう。
または、".htaccess" ファイルに "php_value session.save_path '/home/xxxx/php.session' などとして、セッション情報を格納するディレクトリー自体を個別に変更するという方法もあるようです。