セッションデータの削除
セッションファイルの削除 - 永字八法の続き。
ヒロインリコメンダーでは、CGI::Session::PostgreSQLを使ってる。
(ちなみにCGI::Sessionやそのバリエーションは、全部PurePerlなので鯖にコピペして置くだけで使えるのがありがたい。CPANしなくてすむ。)
しかしそうするとこの自動的にセッションを削除してくれるルーチンが役立たずになるので、新たな方法を考えなければならない。
多分、PostgreSQLのTRIGGERで何とかなるんじゃないかな。
セッションのほかにセッションの最終保存時刻を保存するテーブルを作る。これを仮に、sessions_dateとでもしようか。
CREATE TABLE sessions_date ( id CHAR(32) NOT NULL, last_use TIMESTAMP NOT NULL DEFAULT now() );
こんな感じかな?
そして三つのトリガーを作る。
- INSERT用。セッションが増えたら、sessions_dateにレコードを追加する。
- UPDATE用。セッションが保存、sessions_dateのレコードを更新する。
- DELETE用。セッションが減ったら、sessions_dateのレコードを削除する。
こうしておいて、一日一回くらい、以下のSQLを実行する。
DELETE FROM sessions WHERE id IN (SELECT id FROM sessions_date WHERE last_use < now()-1);
こうすれば、最終更新から1日が経過したセッションが全部消える……と思うんだけどどうですか。
※諸事情により、Perlにてちょこちょこ実装。