CGI::Session
ここんところ、PerlでJavaServletみたいな事をしようと色々遊んでいるところなのだけども、sessionの取得で予想外の事が起こった。
# セッションIDの取得
$sessionId = $self->getSessionId($cookieData, $formData);
$logger->debug("Before Session ID[" . $sessionId . "]");
# セッションの取得
$session = new CGI::Session($driver, $sessionId, {'Directory' => $dataSource});
# セッションIDは取得できたが、IDとしては無効である場合、新規セッションで作り直す
if(defined($sessionId) && $sessionId ne $session->id()){
$logger->warn("This Session ID is Invalid");
$session->close;
$session->delete;
$session = new CGI::Session($driver, undef, {'Directory' => $dataSource});
$logger->warn("Create Other New Session ID[" . $session->id() . "]");
}else{
if(!defined($sessionId)){
$logger->info("Create New Session ID[" . $session->id() . "]");
}else{
$logger->info("Get Session ID[" . $session->id() . "]");
}
}
# 有効期限を設定
$session->expire($expire . "s");
こんな感じでCGI::Sessionを使って取得してるんだけど、sessionを取得するのに妙に時間がかかる。
ログ
[2010-03-22 20:28:40.763][DEBUG][SessionManager:231] Before Session ID[f977f2da04ecc84d3e74df0f17885ecd]
[2010-03-22 20:28:40.819][INFO][SessionManager:249] Get Session ID[f977f2da04ecc84d3e74df0f17885ecd]
819 - 763 = 56
56msもかかっている。何故だ。
ファイルでセッション管理してから多少遅いのはわかるけど、そこまで時間かかるものかなー
SessionIdの暗号化とかデコードに時間かかってるのかなー
モジュールは使えるものは使っておいた方がいいのか、
速くする為に自分で作った方がいいのか。
そもそもCGI.pm使ってない時点で便利なもの使ってないんだからSessionも自分で作り直した方がいいのかなー
--------
[2010-03-23 15:01:12]
追記
CGI::Sessionを継承して色々と時間を計った結果、ドライバモジュールのロードで時間がかかっていました。
CGI::Session(Ver. 4.35)では、780行目で
$self->_load_pluggables();
で、ドライバで指定されたモジュールのロードを行っているため、時間がかかっているように見えます。
sub _load_pluggables では指定したモジュールをrequireでロードしているため、実行に時間がかかっているようです。
でも、そもそもモジュールのロードは use しても行われているため、CGIとして動作している場合は特に実行時間に差はありません。
mod_perlとかでモジュールをキャッシュしている場合は、CGI:Sessionを使用するとセッションを取得するたびにrequireされるため、余計な処理が増えていることになります。(キャッシュされているため、実際にロードされるわけではないが…)
# セッションIDの取得
$sessionId = $self->getSessionId($cookieData, $formData);
$logger->debug("Before Session ID[" . $sessionId . "]");
# セッションの取得
$session = new CGI::Session($driver, $sessionId, {'Directory' => $dataSource});
# セッションIDは取得できたが、IDとしては無効である場合、新規セッションで作り直す
if(defined($sessionId) && $sessionId ne $session->id()){
$logger->warn("This Session ID is Invalid");
$session->close;
$session->delete;
$session = new CGI::Session($driver, undef, {'Directory' => $dataSource});
$logger->warn("Create Other New Session ID[" . $session->id() . "]");
}else{
if(!defined($sessionId)){
$logger->info("Create New Session ID[" . $session->id() . "]");
}else{
$logger->info("Get Session ID[" . $session->id() . "]");
}
}
# 有効期限を設定
$session->expire($expire . "s");
こんな感じでCGI::Sessionを使って取得してるんだけど、sessionを取得するのに妙に時間がかかる。
ログ
[2010-03-22 20:28:40.763][DEBUG][SessionManager:231] Before Session ID[f977f2da04ecc84d3e74df0f17885ecd]
[2010-03-22 20:28:40.819][INFO][SessionManager:249] Get Session ID[f977f2da04ecc84d3e74df0f17885ecd]
819 - 763 = 56
56msもかかっている。何故だ。
ファイルでセッション管理してから多少遅いのはわかるけど、そこまで時間かかるものかなー
SessionIdの暗号化とかデコードに時間かかってるのかなー
モジュールは使えるものは使っておいた方がいいのか、
速くする為に自分で作った方がいいのか。
そもそもCGI.pm使ってない時点で便利なもの使ってないんだからSessionも自分で作り直した方がいいのかなー
--------
[2010-03-23 15:01:12]
追記
CGI::Sessionを継承して色々と時間を計った結果、ドライバモジュールのロードで時間がかかっていました。
CGI::Session(Ver. 4.35)では、780行目で
$self->_load_pluggables();
で、ドライバで指定されたモジュールのロードを行っているため、時間がかかっているように見えます。
sub _load_pluggables では指定したモジュールをrequireでロードしているため、実行に時間がかかっているようです。
でも、そもそもモジュールのロードは use しても行われているため、CGIとして動作している場合は特に実行時間に差はありません。
mod_perlとかでモジュールをキャッシュしている場合は、CGI:Sessionを使用するとセッションを取得するたびにrequireされるため、余計な処理が増えていることになります。(キャッシュされているため、実際にロードされるわけではないが…)
time stamp:2010/03/23 00:43:22
トラックバック(0)|コメント(0)
トラックバック(0)|コメント(0)
この記事のトラックバックURL:
コメントを書く
何かしら