PHPでカスタムセッションを作成しようとしています。しかし、何らかの理由で、私のセッションの読み込みfunctonが呼び出されているだけで、私のセッションの書き込み関数ではありません。したがって、セッションは永続化されません。私がデフォルトのセッションハンドラ(ファイル)に戻ると、すべてが機能します。テストスクリプトの最後にsession_write_close()
を追加すると、すべて動作します。しかし、PHPマニュアルでは、スクリプトの最後に自動的に呼び出されるため、session_write_close()
を明示的に呼び出す必要はないことが明示されています。そして、私は既存のアプリケーションのすべての出口点にsession_write_close()を置いてはいけません!PHPのsession_set_save_handler()で奇妙な問題が発生しました
問題を説明するコードがいくつかあります。私はWinXP SP3 + Apache 2.2.9 + PHP 5.2.6で実行しています。ログファイルには、s_open()
とs_read()
のエントリしか含まれていません。
<?php
function logger($str)
{
file_put_contents('session_log.txt', date('Y-m-d h:i:s') . " $str\r\n", FILE_APPEND);
}
function s_open()
{
logger('s_open');
return true;
}
function s_close()
{
logger('s_close');
return true;
}
function s_read()
{
logger('s_read');
return @file_get_contents('session.txt');
}
function s_write($id, $data)
{
logger("s_write: $id - $data");
file_put_contents('session.txt', $data);
return true;
}
function s_destroy()
{
logger('s_destroy');
return true;
}
function s_gc()
{
logger('s_gc');
return true;
}
session_set_save_handler('s_open', 's_close', 's_read', 's_write', 's_destroy', 's_gc');
session_start();
if (isset($_SESSION['time']))
echo 'Session time: ' . date('Y-m-d h:i:s', $_SESSION['time']);
else
echo 'Session empty';
echo '<br>';
echo 'Session ID: ' . session_id();
$_SESSION['time'] = time();
?>