週末には少しPerlを。

Perlスクリプトの学習日記です。

CGI::Sessionを使うとセッション情報はどのようにファイルに格納されるかを観察する

CGI::Sessionを使った簡単なCGIプログラムを書いてみる

入力フォーム hogesess.cgi に入力した内容を fugasess.cgi で表示することにして、 同時にその内容をセッション情報に格納します。 次回、直接に fugasess.cgi にアクセスしても同じ内容を表示したいとします。

hogesess.cgi は抜粋すると次のようなもの。

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Session;

my $q = CGI->new;
my $session = CGI::Session->new($q)
    or die CGI::Session->errstr;

my $hogename = $session->param('hogename');

$session->expire('1m');

print $session->header;

print $q->start_html('hoge');
print $q->start_form(-method=>'POST', -action=>'fugasess.cgi');

print "hogename";
print "<br />";
print $q->textfield(
      -name => 'hogename',
      -value => $hogename,
      -size => 10,
      -maxlength => 30,
);
print "<br />";
print $q->submit(
    -name => 'hogesubmit',
    -value => 'hogesubmitvalue',
    );

print $q->end_form;
print $q->end_html;

テキストボックス1つとsubmitボタンだけのフォームです。 データを受け取る fugasess.cgi は以下の通り。

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Session;
my $q = CGI->new;
my $session = CGI::Session->new($q)
    or die CGI::Session->errstr;

# $session->save_param(['hogename']);
my $hogename = $q->param('hogename');
if ($hogename) {
    $session->param('hogename', $hogename);
}
$session->expire('1m');

print $session->header;

print $q->start_html('hoge');

$hogename = $session->param('hogename');
print "hogename is $hogename";

print "<br />";
print $q->end_html;

CGI::Session::Turorialの記述によるとPOSTされたデータをセッション情報に格納する方法として save_paramメソッドを使うように書かれているのですが、どうもそれだけだと私のケースでは 直接にfugasess.cgiにアクセスしたときにInternal Server Errorとなるのが格好悪いように思えて避けました。

/tmpに保存されたセッション情報の中身を覗く

環境にも依るのかもしれませんが、デフォルトで/tmpの下に 「cgisess_(セッションID)」のファイル名でセッション情報を格納するファイルが作成されます。 中身は次のようなものでした。

$D = {
'_SESSION_ETIME' => 60,
'_SESSION_ID' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'_SESSION_ATIME' => 1370160147,
'hogename' => 'perltest',
'_SESSION_REMOTE_ADDR' => 'aaa.bbb.ccc.ddd',
'_SESSION_CTIME' => 1370160131
};;$D

Expireされたあと

expireされたあとはどうなるかと思って1分という短い時間を指定してみました。 期待通り、1分以上経過したあとに fugasess.cgiにアクセスしたところ 以前の結果を表示せず新規のセッション扱いとなりましたが、 旧いセッション情報のファイルは /tmpに残ったままとなりました。 なにかしら掃除する仕組みが必要なようです。