【发布时间】:2009-06-20 19:23:33
【问题描述】:
我正在尝试用 PHP 编写自定义会话持久性。但由于某种原因,只有我的会话读取函数被调用,而不是我的会话写入函数。因此会话不会持续存在。如果我切换回默认会话处理程序(文件),一切正常。如果我在测试脚本末尾添加session_write_close() - 一切正常。但是 PHP 手册明确指出您不需要显式调用 session_write_close(),因为它会在脚本末尾自动调用。而且我不想将 session_write_close() 放在现有应用程序的每个可能的退出点!
这里有一些代码可以说明问题。我在 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();
?>
【问题讨论】:
标签: php session persistence