セッションデータの削除

セッションファイルの削除 - 永字八法の続き。
ヒロインリコメンダーでは、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()
);

こんな感じかな?
そして三つのトリガーを作る。

  1. INSERT用。セッションが増えたら、sessions_dateにレコードを追加する。
  2. UPDATE用。セッションが保存、sessions_dateのレコードを更新する。
  3. DELETE用。セッションが減ったら、sessions_dateのレコードを削除する。

こうしておいて、一日一回くらい、以下のSQLを実行する。

DELETE FROM sessions WHERE id IN (SELECT id FROM sessions_date WHERE last_use < now()-1);

こうすれば、最終更新から1日が経過したセッションが全部消える……と思うんだけどどうですか。
※諸事情により、Perlにてちょこちょこ実装。