Opened 15 years ago
Closed 15 years ago
#1457 closed defect (fixed)
セッションストレージをmemcache, dbにした場合、セッションが残っている状態でログイン処理を行おうとすると Fatal error
Reported by: | ebihara | Owned by: | ebihara |
---|---|---|---|
Priority: | major | Milestone: | OpenPNE2.10.6 |
Component: | その他 | Version: | 2.8.x & 2.10.x & 2.11.x |
Keywords: | OpenPNE2.8.11 OpenPNE2.12beta2 | Cc: |
Description (last modified by )
config.phpで
// セッション情報を保存するストレージ // 0:ファイル // 1:データベース // 2:memcache(要PECL::memcache) define('SESSION_STORAGE', 2);
の値を 1 もしくは 2 に設定してセッションストレージをファイル以外にした場合、セッションが残っている状態でログイン処理を行おうとすると Fatal errorが発生する(ただし、エラーの原因となっている箇所で@演算子を使用しているために白画面になる)。
PHPの #32330 session_destroy, "Failed to initialize storage module", custom session handler というバグ( http://bugs.php.net/bug.php?id=32330 )にあり、バグレポート内にあるように、session_save_handler()を2回呼んでしまっているのが原因である。
session_set_save_handler() を2回呼ばないロジックにするなど、このバグを回避するような形で対処する。
Change History (16)
comment:1 Changed 15 years ago by
Description: | modified (diff) |
---|---|
Summary: | セッションストレージを → セッションストレージをmemcache, dbにした場合、セッションが残っている状態でログイン処理を行おうとすると Fatal error |
comment:2 Changed 15 years ago by
Component: | pne-admin → pne-framework |
---|---|
Milestone: | → OpenPNE2.10 |
Priority: | minor → blocker |
comment:3 Changed 15 years ago by
comment:4 Changed 15 years ago by
Description: | modified (diff) |
---|
comment:5 Changed 15 years ago by
Milestone: | OpenPNE2.10 |
---|---|
Priority: | blocker → major |
Version: | → 2.8.x & 2.10.x |
comment:6 Changed 15 years ago by
Priority: | major → minor |
---|
comment:7 Changed 15 years ago by
Keywords: | OpenPNE2.8.10 OpenPNE2.11.5 added |
---|---|
Milestone: | → OpenPNE2.10.5 |
comment:8 Changed 15 years ago by
Keywords: | OpenPNE2.8.10 OpenPNE2.11.5 removed |
---|---|
Milestone: | OpenPNE2.10.5 |
対応が困難なので、今回のリリース項目からは外します。
comment:9 Changed 15 years ago by
Keywords: | OpenPNE2.8.11 OpenPNE2.12beta2 added |
---|---|
Milestone: | → OpenPNE2.10.6 |
Version: | 2.8.x & 2.10.x → 2.8.x & 2.10.x & 2.11.x |
http://sns.openpne.jp/?m=pc&a=page_fh_diary&target_c_diary_id=15822
にて提案されている、
>えびはらこーすけさん @session_destroy(); と set_session_save_handler(); の間に session_write_close(); を挟んでみては如何でしょうか?
という対応方法を検討したいと思います。
comment:10 Changed 15 years ago by
Priority: | minor → major |
---|
comment:11 Changed 15 years ago by
Owner: | changed from nobody to ebihara |
---|---|
Status: | new → assigned |
comment:12 Changed 15 years ago by
バグの原因を詳しく調査してみましたが、OpenPNE_Auth::set_session_save_handler()内で DBSession もしくは MemcachedSession? のインスタンスを作成する際、
- インスタンスを保持するスタティック変数が null の場合はインスタンスを作成して session_set_save_handler() でPHPに登録
- インスタンスを保持するスタティック変数が null でない場合はなにもしない
という処理をおこなっていました。
session_set_save_handler() はセッションを扱う前に必ずコールしておく必要がありますが、OpenPNE_Auth::logout()内で呼ばれる OpenPNE_Auth::set_session_save_handler() ではインスタンスを保持するスタティック変数が null でない場合があるため、session_set_save_handler() がコールされず、PHPが session storage を正しく初期化することができない状態になり、 Fatal error が発生していました。
※OpenPNE_Auth::logout() でコールされる OpenPNE_Auth::set_session_save_handler() でインスタンスを保持するスタティック変数がnullにならないことがある理由は、webapp/init.inc にて OpenPNE_Auth::set_session_save_handler() をスタティックにコールしているから
インスタンスが作成済みの場合は session_set_save_handler() をコールできるはずなので、OpenPNE_Auth::set_session_save_handler() がコールされた場合は毎回 session_set_save_handler() をコールするようにして対処しました。
comment:13 Changed 15 years ago by
Keywords: | 確認中 added |
---|
comment:14 Changed 15 years ago by
Keywords: | テスト待ち added; 確認中 removed |
---|
comment:16 Changed 15 years ago by
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
参考(OpenPNE開発談義ログ)