Loading

ブログ - XCL [XCL 2.1.5] のセッションタイムアウトが変

XCL [XCL 2.1.5] のセッションタイムアウトが変

カテゴリ : 
不具合情報 » その他
執筆 : 
masa 2008/9/9
前々から気になっていたのだが、XCL ってまったくログインタイムアウトしない...
半日放っておいてもタイムアウトしたことがなかった。

ようやく重い腰を上げて調査することにした。
まずは PHP のセッションタイムアウト設定の確認
phpinfo() によると 開発環境では
session.gc_maxlifetime 1440
session.gc_divisor 100
session.gc_probability 0

ふぅん。これってガベージコレクションされないって事?
まぁそれはそれで良いとして...って良いわけないか。

XREAはどうなの?
session.gc_maxlifetime 1440
session.gc_divisor 1000
session.gc_probability 1
かなり低い確率だけど、しないよりはましだね。

さて、問題はガベージコレクションより、なぜ expire しているはずなのに expireしないのかということだが...

XCL の XoopsSessionHandler に問題があるようだ。
function read() の中で DBにシリアライズしたセッションを読み出しているが、この時に sess_updated を考慮していないので、ガベージコレクションでDBから消されない限り、セッションタイムアウトしないということだろう。

というわけで修正してみる。
直接いじるのはよろしくないので、継承してプリロード差し替えで試す。
class SessionHandlerEx extends XoopsSessionHandler {
    private $mTable;
    private $mExpire = 0;

    function __construct(&$db) {
	parent::__construct($db);
	$this->mTable = $this->db->prefix('session');
    }

    function setExpire($expire) {
	$this->mExpire = $expire;
    }

    function read($sess_id) {
	$sql = sprintf('SELECT sess_data FROM %s WHERE sess_id = %s', $this->mTable, $this->db->quoteString($sess_id));
	if ($this->mExpire > 0) {
	    $mintime = time() - intval($this->mExpire);
	    $sql .= sprintf(' AND sess_updated >= %u', $mintime);
	}
	if ($result = $this->db->query($sql)) {
	    if (list($sess_data) = $this->db->fetchRow($result)) {
		return $sess_data;
	    }
	}
	return '';
    }
}

ついでに「セッションの設定をカスタマイズする」とは関係なくセッションタイムアウトの設定を読み込むようにしてみよう。

$root =& XCube_Root::getSingleton();
$xoopsConfig = $root->mContext->mXoopsConfig;
$min = $xoopsConfig['session_expire'];
$sessionHandler->setExpire($min * 60);

一応動いたかも?
オートログアウトするようになった。
でも、ログアウトしないほうが気楽だったけどね...
  • トラックバック (0)
  • 閲覧 (15571)