セッションのタイムアウト手段について - PHPプロ!Q&A掲示板

449

  • 0P

セッションのタイムアウト手段について

質問日時 / 2007年4月9日 23:45    回答数 / 4件

Questioner:  yassan  このエントリーをはてなブックマークに追加 

キーワード / セッション    session    タイムアウト   

はじめまして
PHPでログインを作成したのですが、希望の通りにタイムアウトができません。
アドバイスいただければ幸いです。

動作環境
 WindowsXP-SP2+XAMPP1.6(Apache2.2.4、PHP5.2.1)

希望動作
ログイン(PEAR::AUTHを利用)した後、認証管理下のいずれかのページへの
最終アクセスから5分後にセッションを破棄して、それ以降のアクセス時には
再度ログインを要求するという動作です。
---
そこで、色々と調べてみた結果、php.iniの中で、

session.gc_probability = 1
session.gc_divisor     = 1
session.gc_maxlifetime = 300

としてみたのですが、ずっと放置(数10分)してもセッションが
有効のままのようで、再ログイン不要でページを渡れてしまいます。
c:\xampp\tmp下にsess_****ファイルも存在したまま。

ちなみに、
1)ブラウザ(IE6)を一度落とすと、ログインページに飛びます。
2)php.iniの中で、session.cookie_lifetime = 300
とするとログイン後5分経つとタイムアウトしてログインページに飛びます。

そもそも、php.iniの設定だけでは希望のような動作は無理なんでしょうか?
宜しくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01tyatya上記の内容を確認させていただきました。 たしかにph
 ┗A01-1yassantyatyaさん返答ありがとうございます。 ログイン後
  ┗A01-1-1tyatyayassanさん内容を確認させていただきました。 なる
   ┗A01-1-1-1yassan>セッションハンドラーのクラスを作成して、セッショ

回答一覧

並び替え:

A01
answerertyatya [4月10日 13:09]

上記の内容を確認させていただきました。
たしかにphp.iniの設定だけではセッションがきれて再度認証させて
処理を続けるみたいなことは難しいとおもいます。

>希望動作
>ログイン(PEAR::AUTHを利用)した後、認証管理下のいずれかのページへの
>最終アクセスから5分後にセッションを破棄して、それ以降のアクセス時には
>再度ログインを要求するという動作です。
>2)php.iniの中で、session.cookie_lifetime = 300
>とするとログイン後5分経つとタイムアウトログインページに飛びます。
希望の内容がセッションを切れたときにログインページへ遷移するということではないんですか?
答えが合っているかちょっとわかりませんが、
再度ログインするという意味で、
下記の設定を応用して作成するのはいかがでしょうか?

2)php.iniの中で、session.cookie_lifetime = 300
とするとログイン後5分経つとタイムアウト

最後にアクセスしたときにセッションログインエラーがおきたページを保持する
「SERVER["REQUEST_URI"]」を保存

ログインページに飛びます。

再度ログイン処理をする。

成功した場合に最後にアクセスしていたページへ遷移させる。

こういったことでしょうか?
ご参考になれば幸いです。

この意見に回答する

ツリーへ TOPへ

A01-1
replyeryassan [4月11日 02:33]

tyatyaさん返答ありがとうございます。

ログイン後、制限時間の5分以内にアクセスがあれば、そのアクセス時点から引き続き同じセッションIDが5分間有効という風に延長させたいのですが、提案いただいた方法での具体的な実装が思いつかなかった為、検討の結果、次のような方法で対応しました。

セッションデータのファイル更新日時がアクセスの度に更新されるのを利用して、cygwinのcronで下記のtimeout.phpを定期的に実行して、セッションデータを削除する事でタイムアウトを発生させています。

※一応は動作していますが、初心者ですので不具合を起こす可能性は無いのか?までは....

timeout.php
  1. <?php
  2. //セッション有効時間(秒)
  3. $KeepAliveTime=300;
  4. //セッションデータパス
  5. $sesspath=session_save_path();
  6.  
  7. //タイムアウトしたセッションデータを検索&削除
  8. foreach (glob("$sesspath\\sess_*") as $fname) {
  9.   if(filemtime($fname) + $KeepAliveTime < time()) {
  10.     @unlink($fname);
  11. //削除したセッションID
  12.     $tmp=split("sess_"$fname);
  13.     echo("ID=".$tmp[1]);
  14.   }
  15. }
  16. exit();
  17. ?>

この意見に回答する

ツリーへ TOPへ

A01-1-1 参考になった
replyertyatya [4月11日 12:24]

yassanさん内容を確認させていただきました。

なるほど・・セッションのファイルをそのまま操作する方法ですね。

私が以前、行なった方法でも似たようなことをしていました。

私の場合はそもそもセッションをファイルで管理するのをやめて、
セッションハンドラーのクラスを作成して、セッションの操作を行ないました。

具体的にはDBにセッションをserialize化させて保存して、保存、読み込みの操作するという方法でした。
同じように特定時間に「セッションデータを削除する」クーロンを同じように作っていました。

yassanさんの方法を見ていて、
ちょっと記述してみました^^;

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyeryassan [4月16日 23:53] (最終編集:4月16日 23:54)

>セッションハンドラーのクラスを作成して、セッションの操作を行ないました。

session_set_save_handler()で、自作のセッション管理関数を呼び出すようにする方法ですね?

私も今度チャレンジしてみようと思ってます。

私の方法で今のところ思ったように動いているので本件クローズします。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)