[PHP-users 28863] Re: セッション処理つきまして

Shu Sawada luna @ lunanet.gr.jp
2006年 3月 28日 (火) 22:18:34 JST


さわだです。

> 昨日、セッションタイムアウトイベントを取得したいという趣旨の投稿をいたしました。
> ご回答頂いた案ではなく、自前での処理にしたのですが、その内容は
> 
> セッション開始時に$_SESSION["MySesssion"]=session_id()とし、
> 各ページ遷移時に$_SESSION["MySesssion"]の値をDBに問い合わせ
> 以前のセッションから指定時間が経過しているかどうか調べる
> ということにしました。
> (タイムアウトしていればそのセッション変数はDBから削除し、セッションの終了とします。)
>
> 私としてはこの方法で実装してみたのですが、他のページに遷移すると
> $_SESSION["MySesssion"]がUndefinedのエラーとなってしまいます。

とりあえず、どういうテーブルでどういうプログラムを使ってどうセッションが入っていて、
それらの値をどう参照しているかという情報が無いと何とも、という気がします。
それで、ごめんなさい、これは何というか、作成されたセッションハンドラのデバッグという
話のように感じるのですが、、、
Undefinedになるんだから、セッションの値が保存されていないか、参照できていないん
じゃないでしょうか。

判る範囲で書くと、セッションにsession_id()を使ってセッションIDを保存する理由って
何でしょうか。
セッションをデータベースで管理するとすると、session_idが primary key 的なものになると
思うのですが、それって、

"insert into session_tbl
	(sess_id, sessdata, uptime)
	values
	(" .  session_id() . ", $sess_data, 'now' )";

みたいなイメージなんじゃないかと思います。
で、各ページ遷移時には、

"select * from session_tbl
	where sess_id='" . session_id() . "'";

みたいな感じなんじゃないでしょうか。

#こんな単純じゃないですが

自作ハンドラは、だいぶ昔に一度作ったきりなんで、間違っていたらごめんなさい。
そういえば、その時に僕が参考にしたのは、
http://www.stackasterisk.jp/tech/php/php03_06.jsp
です。

> C:\PHP\sessiondataディレクトリ内にセッションファイルが無数にできますが、
> あれはガベージコレクタ等が削除はしてくれないのでしょうか?
> そのままたまり続けるのでしょうか?

windows版をマトモに使ったことがないので断言できませんが、少なくともLinux環境では
GCが回収してくれます。
http://www.php.net/manual/ja/ref.session.php
あたりの、session.gc_**** 系の設定値はご覧になりましたか?

session.gc_probability / session.gc_divisor が大きくなるようにしてみたり、
session.gc_maxlifetime を小さくしてみたりとか、どうでしょうか。

#もしWindowsで挙動が違うということであればごめんなさい。

-- 
Shu Sawada
http://luna.lunanet.gr.jp/


PHP-users メーリングリストの案内