我正在尝试用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();
?>
答案 0 :(得分:1)
Blargh!抓住了PHP本身放在那里的通知!引用手册:
警告强>
如果在脚本终止中关闭会话,则会使用某些SAPI更改当前工作目录。可以使用
session_write_close()
提前关闭会话。
确实发生了变化,对s_write()
和s_close()
的调用记录在另一个目录中!