PHPにおいて、セッションに存続時間を設定し、自動的に終了する方法を教えてください。


私が調べた限り、次の方法が存在するようですが、

①ini_set('session.gc_maxlifetime',600);
②session_cache_expire(60);

特に、②について、内部的に何が行われているのかわかりませんでした。

回答の条件
  • 1人3回まで
  • 登録:2006/07/28 15:41:02
  • 終了:2006/08/04 15:45:03

回答(1件)

id:bonlife No.1

回答回数421ベストアンサー獲得回数752006/07/28 16:41:06

ポイント60pt

すでにマニュアルは確認済みでしょうか。

session.gc_maxlifetime は、データが'ごみ'と みなされ、消去されるまでの秒数を指定します。

gc(ガベージコレクション)の発生確率を設定するsession.gc_probability、session.gc_divisorの設定を適切にしていないと期待したタイミングで削除することはできませんのでご注意ください。

session_cache_expire()はカレントの session.cache_expireの設定を返します。

上記のようにこの関数はsessionのキャッシュの有効期限を返す、あるいは設定するためのものです。

(セッションそのものではなく、キャッシュの設定です。)

キャッシュの設定はsession.cache_limiterがnocacheの時には全く意味がありません。

session.cache_limiterのデフォルトはnocacheです。

(sessionを使う必要があるサイト(例えばオンラインショップなど)の場合「戻る」で戻られると問題になることがあります。)

PHP-usersメーリングリストの上記のスレッドで一定時間経過後にでログアウトさせる方法について論じられていたことがあります。

"セッションの有効期限切れ=ログアウト"とせずに、セッションデータ内に

最終アクセス時間(または有効期限切れ時間)を記録して比較するだけで

実装できます。

この方法を参考にしてみてはいかがでしょうか。

参考になれば幸いです。

id:witt

ご推察のとおり、私が本件について調べているのは、

自動的にログアウトするための実装を知りたいからです。

ユーザがWebアプリにログインして、一定時間経過後、

何らかの方法の方法で自動的にセッションを終了させ、

その後、ユーザがWebアプリにアクセスしてきたら、

次の方法でトップページにリダイレクトさせようと

考えていました。

if(!isset($_SESSION['login'])){

  //トップページにリダイレクト

}

①の方法については、一定時間経過後、セッションが

破棄されるかは session.gc_probability による確率に

依存するようですが、無効にはなのようですから

(ソフトバンク「PHP4徹底攻略実践編」p.52 l.8)、

私の考えはうまくいきそうだと思っていました。

ちなみに、①については、オライリー「初めてのPHP5」p.158 l.4

からの情報です。

②の方法については、そもそもなんで、キャッシュと

セッションの終了が関係があるのかわかりませんでした。

この情報源は、技術評論社「PHPポケットリファレンス」p.502です。

これはセッションの終了に使えないのではないか、この著者の

勘違いではないか、と思います。

以上、私の考えに不備があれば、ご指摘いただければ助かります。

PHPについて、一次情報である

PHPマニュアル http://jp.php.net/manual/ja/index.php

を含め、いろいろ調べていますが、詳細なところのドキュメントが

少なく、あいまいな記述が多いため、ミッションクリティカルな

コードを書くには不安を感じています。

---

セッションの有効期限切れ=ログアウト"とせずに、セッションデータ内に

最終アクセス時間(または有効期限切れ時間)を記録して比較するだけで

実装できます。

---

このやり方が一番無難で確実だと思いました。これで実装したいと思います。

ありがとうございます。

2006/07/29 09:43:48

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません