session_save_path

24時間365日戦える営業マンを作りあげます。ホームページコンサルタント山田直毅(なおたか)です。


ユーザがサイトにアクセスしている間、ユーザ固有の値を保持する方法の1つとしてセッションを利用することが多い。(値保持の方法の1つである)セッションとはユーザのブラウザに保存されるcookie(クッキー情報)にセッションIDを埋め込み、そのセッションIDをユーザがサイトにアクセスするたびに復元して、セッションIDに紐づいたテキストファイルやDBの値をサーバ内で取り出して再利用する方法だ。


PHPでは、セッションをファイルで管理している場合、session_save_path()や設定値:session.save_pathを利用することでプログラムやシステム毎に異なるディレクトリにセッション情報を保存することが可能だ。例えば、エンドユーザ向け機能と管理者向け機能が同じドメイン配下に設置されるような場合、セッションファイルの格納ディレクトリを同一にしてしまうと、管理者向け機能にログインした状態でエンドユーザ向け機能にもログインした際に、管理者向け機能でのログイン情報が上書きされてしまい、次に管理者向け機能を使用した場合、再度ログインしなければいけないという結果になる場合がある。


セッションは結局のところ1つの連想配列($_SESSION)で管理されている。session_save_pathを利用しないで複数のサービスのセッションを活かす場合、連想配列の一番最初のキーを名前空間として利用し、その下に各機能の連想配列を配置するという対処法が一般的なようだ。フレームワークのセッションクラスを見ると、名前空間を宣言する記述が多く見られる。


この方法でも良いと思うが、session_save_pathを利用して機能毎にセッションファイルの格納ディレクトリを切り分けるという解決法が楽だと個人的には考えている。


エンドユーザ向け機能と管理者向け機能とでセッションの有効期限を別々にしたいという要望をよく受けるが、セッションファイルの格納場所が同一のディレクトリだと対処が難しい。セッションの有効時間は設定値:session.gc_maxlifetimeで定義することができる。デフォルトは1440秒:24分間。この有効期限を過ぎるとgcガーベッジコレクション(ゴミ収集)の対象となり、有効期限を過ぎた後にセッションファイルに誰かしらがアクセスした際に削除されてしまう。ガーベッジコレクションディレクトリ単位で実施される為、エンドユーザ向け機能と管理者向け機能とで異なる秒数を定義していても、短い方につられて削除されてしまうことがあるのだ。


それならばいっそ分けてしまおう。