(18) session保持時間を制御

投稿者: | 2016年11月25日

2,614 views

この記事は最終更新から 2600日 が経過しています。

(1) やりたいこと

共有サーバー上でセッション保持時間を延長したい。

詳細はここを参照のこと。
http://php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime

まずは…
phpinfo() で現在の設定を確認してみる。

上図のように、現在の設定だと、
最終アクセスから 1440秒経過後に 1/100の確率で Garbage Collection機能により削除される。
となっている。

1440秒すなわち 24分間、ちょっと席を外している間にセッションが切れてしまうのだ。
これはちょっと不便。

今回はこれを2時間に変更したい。

(2) 実現手段

1) 共有サーバー故の制約

このブログは年額約4,000円の共有サーバー(Value-Server)上に設置している。
このため単純に session.gc_maxlifetime の値を変更しただけではセッション保持時間を長くすることができない。

なぜならば、前述の phpinfo() の情報によると、
session.save_path = /tmp
となっており、共有サーバーに同居している全ユーザーが /tmp にセッション情報を保存しているから。

即ち…
ここにセッション情報を保存する限り、ローカルでパラメーターをどう変更しようが、
session.gc_maxlifetime = 1440
が適用されてしまうのだ。

2) 制約を回避する方法

そこで、セッション情報の保存場所を独自に設定する必要がある。

phpプログラムで session_start() を実行する前にこれを行えばよい。

ini_set('session.save_path', '~/myss');
session_start();

ディレクトリ名はなんでもよい。ここではユーザーホームディレクトリ直下に myss なるディレクトリを作成した。

3) この場合の注意点

前述の phpinfo() で表示された session.save_path 以外のディレクトリでセッション情報を保持する場合、
当該情報は Garbage Collection機能の対象外となってしまう。

すなわち、指定時間を超えてもセッション情報が消去されない。
これは困った…

これに対しては、自前で定期的に Garbage Collectionする必要がある。
例えば、以下のようなスクリプトを crond で実行すればよい。

#!/bin/sh
find ~/myss -cmin +120 -type f | xargs rm

この例では、独自のセッション保存ディレクトリ中のファイルの中で最後の更新から 120分以上経過した物を削除している。このスクリプトを crond で1時間に 1回程度動かせばよい。

4) 最終的にやりたいことをこう実現した

(1) PHPプログラム

ini_set('session.save_path', '~/myss');
session_start();

(2) Shellスクリプト(crondで1時間に1回起動)

#!/bin/sh
find ~/myss -cmin +120 -type f | xargs rm

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)