ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Opened 12 years ago

Closed 12 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 ebihara)

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 12 years ago by ebihara

Description: modified (diff)
Summary: セッションストレージをセッションストレージをmemcache, dbにした場合、セッションが残っている状態でログイン処理を行おうとすると Fatal error

comment:2 Changed 12 years ago by ebihara

Component: pne-adminpne-framework
Milestone: OpenPNE2.10
Priority: minorblocker

comment:3 Changed 12 years ago by ebihara

参考(OpenPNE開発談義ログ)

[17:08:49] おがわおがわの発言: session_set_save_handler() を2回呼ばないロジックにする
[17:09:16] おがわおがわの発言: 既存セッション消したらリダイレクトとか
[17:09:48] おがわおがわの発言: あ、でもPEAR AuthってPOSTじゃないと動かないんだっけ?
[17:10:26] おがわおがわの発言: けっこうめんどうそうだなあ

comment:4 Changed 12 years ago by ebihara

Description: modified (diff)

comment:5 Changed 12 years ago by ogawa

Milestone: OpenPNE2.10
Priority: blockermajor
Version: 2.8.x & 2.10.x

comment:6 Changed 12 years ago by kiwa

Priority: majorminor

comment:7 Changed 12 years ago by kiwa

Keywords: OpenPNE2.8.10 OpenPNE2.11.5 added
Milestone: OpenPNE2.10.5

comment:8 Changed 12 years ago by ebihara

Keywords: OpenPNE2.8.10 OpenPNE2.11.5 removed
Milestone: OpenPNE2.10.5

対応が困難なので、今回のリリース項目からは外します。

comment:9 Changed 12 years ago by ebihara

Keywords: OpenPNE2.8.11 OpenPNE2.12beta2 added
Milestone: OpenPNE2.10.6
Version: 2.8.x & 2.10.x2.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 12 years ago by ebihara

Priority: minormajor

comment:11 Changed 12 years ago by ebihara

Owner: changed from nobody to ebihara
Status: newassigned

comment:12 Changed 12 years ago by ebihara

バグの原因を詳しく調査してみましたが、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 12 years ago by ebihara

Keywords: 確認中 added

comment:14 Changed 12 years ago by ogawa

Keywords: テスト待ち added; 確認中 removed

comment:15 Changed 12 years ago by kiwa

Keywords: テスト待ち removed

確認しました。問題なさそうです。

comment:16 Changed 12 years ago by kiwa

Resolution: fixed
Status: assignedclosed
Note: See TracTickets for help on using tickets.