質問 > その他 > セッションがうまくタイムアウトされません |
その他
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
hatake |
投稿日時: 2010/10/2 21:28
対応状況: −−−
|
常連 登録日: 2009/12/3 居住地: 東京 投稿: 58 |
セッションがうまくタイムアウトされません こんばんは。
先日、セッションについて質問してうまくいったような気がしましたが やっぱり駄目でした。再度質問させてください。 セッションの有効期限を設定するために session_set_cookie_params(0, "/", DOMAIN_NAME);を session_set_cookie_params(600, "/", DOMAIN_NAME);にすると 10分経過すると必ずセッションが破棄されてしまいます。 10分の間何回かリロードしましたが10分経つとセッションが破棄されてしまいます。 ただ、これをしないと一晩過放置してもセッションが有効なままです。 ブラウザを放置して10分経過したときのみセッションが破棄されるように するためにはどのようにしたらよろしいのでしょうか。 環境 [EC-CUBE] 2.4.3 [サーバ] 自前 [OS] redhat Linux 2.6.18 [PHP] PHP 5.2.14 [データベース] MySQL 5.0.27 [WEBサーバ] Apache 2.2.16 以上、よろしくお願いします。 |
seasoft |
投稿日時: 2010/10/2 22:24
対応状況: −−−
|
神 登録日: 2008/6/4 居住地: 投稿: 7367 |
Re: セッションがうまくタイムアウトされません うろ覚えですが、カスタマイズの場所が違うような気がします。
もう少し、広くソースを見たほうが良いかも。 (追記) パラメータ「SESSION_LIFETIME」とか、関係あるかも。
|
pantacle |
投稿日時: 2010/10/3 1:48
対応状況: −−−
|
長老 登録日: 2009/6/29 居住地: 富山 投稿: 242 |
Re: セッションがうまくタイムアウトされません session_set_cookie_params(600, "/", DOMAIN_NAME);
では、セッション維持に使用するCookieに有効期限が設定されますが、有効期限内であればブラウザを落としてもCookieが生きているためセッションが継続されてしまいます。 セッションが継続される事が問題でないのなら、Cookieの有効期限を延長するためにCookieをアクセス毎に明示的に出力する必要があります。 単純に自前でセッションに最終アクセス時刻を記録して、それをチェックするのが手早く妥当な解かと思われます。
|
hatake |
投稿日時: 2010/10/3 14:30
対応状況: −−−
|
常連 登録日: 2009/12/3 居住地: 東京 投稿: 58 |
Re: セッションがうまくタイムアウトされません ありがとうございます。
色々と調べた結果、session_set_cookie_paramsには、0を設定し ブラウザを閉じるまで有効にしとくのが良いのだろうと思いました。 ただ、クライアント側のセッションでなくサーバー側のセッションは、 正しくタイムアウトされるべきだと思います。 そこでEC CUBEでは、通常のセッションの他にDBで管理しているセッションがありました。 PHP.iniの設定を変更し、短い時間でタイムアウトを起こそうとしても DBで管理しているセッションが存在す限りセッション切れにならないようです。 その有効期限は、mtb_constants.phpの「MAX_LIFETIME」で管理されていました。 どうもセッションが開始されたときにDBのセッションを取得しているようです。 取得したセッションがセッション変数に設定されているのか不明です。 session_set_save_handlerの仕様をいまいち理解できてません。 また、通常のセッションが切れてDBのセッションが切れていない場合や 通常のセッションは切れず、DBのセッションが切れた場合のセッションIDは どうなっているのでしょうか? 以上、よろしくお願い致します。 |
pantacle |
投稿日時: 2010/10/3 16:36
対応状況: −−−
|
長老 登録日: 2009/6/29 居住地: 富山 投稿: 242 |
Re: セッションがうまくタイムアウトされません session_set_save_handler()の仕様を理解する必要は通常有りません。
セッションの保存方法がDB等に変更されているだけで、特別な違いは無いと考えて良いです。 > そこでEC CUBEでは、通常のセッションの他にDBで管理しているセッションがありました。 > PHP.iniの設定を変更し、短い時間でタイムアウトを起こそうとしても > DBで管理しているセッションが存在す限りセッション切れにならないようです。 > その有効期限は、mtb_constants.phpの「MAX_LIFETIME」で管理されていました。 PHPセッションは、その保存先がファイルであれDBであれ、php.ini等で設定した期間以上更新が無いものをガベージコレクションの対象にし、セッションIDと関連するデータを削除します。 また、ガベージコレクションは毎アクセスごとには行なわれず、同じくphp.ini等で設定した確率に従って実行されます。 EC-CUBEのSC_Helper_Session::sfSessGc()はガベージコレクション時に実行される処理である為、MAX_LIFETIMEをどのように設定しても、ガベージコレクション自体が確率で制御される限りは確実にMAX_LIFETIMEでセッションが無効になる事は保証されません。 うろ覚えですが、ガベージコレクションが行なわれない限り、PHPセッションは生きていると考えて良かったはずです。 > また、通常のセッションが切れてDBのセッションが切れていない場合や > 通常のセッションは切れず、DBのセッションが切れた場合のセッションIDは > どうなっているのでしょうか? セッションCookieの生存と、PHPセッションの生存を混同されているように思われます。 hatakeさんが言われる「通常のセッションが切れ(セッションCookieが失効)」「DBのセッションが切れていない(PHPセッションは生きている)」場合、何らかの方法でセッションIDを指定されるとPHPセッションは継続して使用されます。 「通常のセッションは切れず(セッションCookieは有効)」「DBのセッションが切れた(PHPセッションが削除)」場合は、そのセッションIDで新規の(空の)セッションが作成されます。 Zend Frameworkでもセッションの有効期間管理はプログラムで行なっていますので、PHPのセッション機構のみではセッションタイムアウトを実現できないと考えたほうが良いです。 ほんの数行プログラムに書き加えるだけで十分機能します。
|
hatake |
投稿日時: 2010/10/3 17:34
対応状況: −−−
|
常連 登録日: 2009/12/3 居住地: 東京 投稿: 58 |
Re: セッションがうまくタイムアウトされません ありがとうございます。
だいぶ理解できました。 PHPのセッションは、DBで保存するかファイルで保存するかの2種類 あるということなんですね。 両方使用しているのかと思いました。 セッション切れの質問は、両方が機能してるものだと思いどっちが 優先されるのか?と思ったからです。 私なりに理解するとsession_set_save_handlerを使用し場合は、DBに保存され 使用しないとファイルで保存されるという事ですね。 セッション切れの破棄は、PHP.iniの設定で行われるのも理解できました。 ただSC_Helper_Session::sfSessGc()は、セッションスタート時も 動いているような感じがしましたが間違いでしょうか? 以上、よろしくお願い致します。 |
pantacle |
投稿日時: 2010/10/3 20:43
対応状況: −−−
|
長老 登録日: 2009/6/29 居住地: 富山 投稿: 242 |
Re: セッションがうまくタイムアウトされません > PHPのセッションは、DBで保存するかファイルで保存するかの2種類
> あるということなんですね。 通常はファイルとして処理されるが、session_set_save_handler()を用いる事で保存先や処理方法を変更する事ができる、です。 DBと決めて掛かると別のところでハマるかもです。 > ただSC_Helper_Session::sfSessGc()は、セッションスタート時も > 動いているような感じがしましたが間違いでしょうか? セッションのガベージコレクションはあくまでも確率で動作します。 PHPのデフォルトでは各リクエスト毎に1%の確率のはずですが、SC_Helper_Session::sfSessGc()が必ず動いているとしたら、php.ini等で確率が100%になるよう設定されているのかもしれません。 session.gc_probability、session.gc_divisorをチェックしてみてください。
|
hatake |
投稿日時: 2010/10/4 12:06
対応状況: −−−
|
常連 登録日: 2009/12/3 居住地: 東京 投稿: 58 |
Re: セッションがうまくタイムアウトされません ありがとうございます。
良くわかりました。通常場合でもsession_set_save_handlerを使用してreadで セッションを取得する場合でもgcが実行されるタイミングは同じという事ですね。 readに設定した関数から返却される文字列がセッション変数に設定されると 言う事ですね。 で、前の回答にあった >Zend Frameworkでもセッションの有効期間管理はプログラムで行なっていますので、PHPのセッション機構のみではセッションタイムアウトを実現できないと考えたほうが良いです。 >ほんの数行プログラムに書き加えるだけで十分機能します。 というのは、何らかの形でreadに設定した関数内で自セッションの有効期限を判断して 有効期限が切れている場合は、dtb_sessionのデータを削除する処理を追加 という事ですか? 以上、よろしくお願い致します。 |
pantacle |
投稿日時: 2010/10/4 14:39
対応状況: −−−
|
長老 登録日: 2009/6/29 居住地: 富山 投稿: 242 |
Re: セッションがうまくタイムアウトされません > 有効期限が切れている場合は、dtb_sessionのデータを削除する処理を追加
> という事ですか? 該当セッション開始後に $_SESSION = array(); するだけで目的は果たせる筈ですので、dtb_sessionを直接触る必要は有りません。 仮にセッションに設定する最終アクセス日時を $_SESSION['lastAccess'] に記録するとすると、 session_start()の直後に、 ・$_SESSION['lastAccess'] の有無をチェック ・$_SESSION['lastAccess'] があれば $_SESSION['lastAccess'] と現在時刻の差分を求め、既定間隔を超えていればセッションを初期化 ・$_SESSION['lastAccess'] に現在時刻をセット という処理を追加する感じかと。
|
hatake |
投稿日時: 2010/10/5 15:13
対応状況: −−−
|
常連 登録日: 2009/12/3 居住地: 東京 投稿: 58 |
Re: セッションがうまくタイムアウトされません ありがとうございます。
うまくいきました。 SESSIONについて理解が深まりました。 以上、よろしくお願い致します。 |
(1) 2 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |