バージョン選択

フォーラム

メニュー

オンライン状況

36 人のユーザが現在オンラインです。 (29 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 36
もっと...

サイト内検索

質問 > その他 > セッションがうまくタイムアウトされません

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
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」とか、関係あるかも。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

pantacle
投稿日時: 2010/10/3 1:48
対応状況: −−−
長老
登録日: 2009/6/29
居住地: 富山
投稿: 242
Re: セッションがうまくタイムアウトされません
session_set_cookie_params(600, "/", DOMAIN_NAME);
では、セッション維持に使用するCookieに有効期限が設定されますが、有効期限内であればブラウザを落としてもCookieが生きているためセッションが継続されてしまいます。
セッションが継続される事が問題でないのなら、Cookieの有効期限を延長するためにCookieをアクセス毎に明示的に出力する必要があります。

単純に自前でセッションに最終アクセス時刻を記録して、それをチェックするのが手早く妥当な解かと思われます。


----------------
pantacle
http://pantacle.net/

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のセッション機構のみではセッションタイムアウトを実現できないと考えたほうが良いです。
ほんの数行プログラムに書き加えるだけで十分機能します。


----------------
pantacle
http://pantacle.net/

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をチェックしてみてください。


----------------
pantacle
http://pantacle.net/

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'] に現在時刻をセット
という処理を追加する感じかと。


----------------
pantacle
http://pantacle.net/

hatake
投稿日時: 2010/10/5 15:13
対応状況: −−−
常連
登録日: 2009/12/3
居住地: 東京
投稿: 58
Re: セッションがうまくタイムアウトされません
ありがとうございます。

うまくいきました。

SESSIONについて理解が深まりました。

以上、よろしくお願い致します。
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は89,080名です
総投稿数は110,028件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1649
8
red
1570
9
mcontact
1296
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.