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;
}
トラックバック URL:
https://perltips.twinkle.cc/trackback/10