Perl で、セッション管理をしたい。 (Apache::Session)

Apache::Session を使う。 パフォーマンスを少し測ってみたら CGI::Session よりも若干速いようである。

このモジュールは eval {...}; とセットで使うとよい。 - Perl で、例外処理をするような感じのもの。if($@) {...} のセットで使う。eval にはセミコロン(;) を忘れないこと。

例では、%session を $session としてハッシュで返している。
このモジールを使う利点は、ID の長さを自由に変えられることである。CGI::Session の場合は、ID の長さを変えたければ、自分で書かなければならない。一方で短所は、セッションの有効期限を設定できないこと。そのため、MySQL 中のsessions テーブルに timestamp フィールドを独自に追加して、自身の CGI の中か cron で適宜 reap する必要がある。また、セッションオブジェクト中の個別のデータにも有効期限を設けることはできない (CGI::Session はできる)。それでもこのモジュールが良いのは、パフォーマンスが CGI::Session よりも若干良いのと、ID の長さを変えられるからである。


use DBI;
use Apache::Session;

このモジュールは永続ストレージ (要はセッション情報をずっと溜めておけるデータベース) の種類によっていろいろな種類がある。


Apache::Session::MySQL
Apache::Session::Postgres
Apache::Session::File
Apache::Session::Oracle
Apache::Session::Sybase
Apache::Session::DB_File
Apache::Session::Flex 	実行時にすべてのパラメータを指定する

以下の例では Apache::Session::Flex を使っている。

use DBI; use Apache::Session::Flex; $session = _getSession; print $session->{_sessin_id} sub _getSession {
my $db;
my ($database, $username, $password);
# 以上の変数には値を入れること。

$db = DBI->connect("DBI:mysql:$databasename",
                             $username,
                             $password
                             ) || die 'Cannot connect db';
eval {
tie %session, 'Apache::Session::Flex', $sid, {

    Store      => 'MySQL',
    Lock       => 'MySQL',
    Generate   => 'MD5',
    IDLength   => 32,
    Serialize  => 'Storable',
    Handle     => $db,
    LockHandle => $db,
};
}; # セミコロンを忘れないこと if($@) { # $@: error message of eval
return undef;
} # セッション ID の取得に成功。ここに処理を書く。
return \%session;
}
参考書とリンク
  • Perl の小技 - Apache::Session モジュール v1.52
  • Web+DB press (特別総集編) - 技術評論社 ISBN: 4774130729 (2007/03) (以下をクリック。上の Vol.5 も含まれる。かなりお買い得な気がする)
    <iframe src="https://xml-jp.amznxslt.com/onca/xml?Service=AWSECommerceService&ItemId=4774130729&AWSAccessKeyId=152ZP71KPB47XM09CS02&AssociateTag=twinklexxx-22&Operation=ItemLookup&IdType=ASIN&ContentType=text%2Fhtml&Version=2006-03-08&Page=1&ResponseGroup=ItemAttributes,Images,Offers&Style=https://perltips.twinkle.cc/files/sites/perltips/xsl/amazon.xsl" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" height="180"></iframe>

Comments