PHP中session_set_save_handler()存在奇怪的问题

PHP中session_set_save_handler()存在奇怪的问题,php,session,persistence,Php,Session,Persistence,我正在尝试用PHP编写一个自定义会话持久器。但由于某些原因,只调用了会话读取函数,而没有调用会话写入函数。因此,会话不会持久化。如果我切换回默认的会话处理程序(文件),一切正常。如果我在测试脚本的末尾添加session\u write\u close()。但是PHP手册明确指出,您不需要显式调用会话\u write\u close(),因为它会在脚本结束时自动调用。我不想在现有应用程序中的每个可能的退出点都放置session_write_close() 下面是一些说明问题的代码。我在WinXP

我正在尝试用PHP编写一个自定义会话持久器。但由于某些原因,只调用了会话读取函数,而没有调用会话写入函数。因此,会话不会持久化。如果我切换回默认的会话处理程序(文件),一切正常。如果我在测试脚本的末尾添加
session\u write\u close()。但是PHP手册明确指出,您不需要显式调用
会话\u write\u close()
,因为它会在脚本结束时自动调用。我不想在现有应用程序中的每个可能的退出点都放置session_write_close()

下面是一些说明问题的代码。我在WinXP SP3+Apache2.2.9+PHP5.2.6上运行它。日志文件仅包含
s_open()
s_read()
的条目


废话!被PHP自己放在那里的通知抓住了!引用手册:

警告

如果在脚本终止中关闭了会话,则当前工作目录将使用一些SAPI进行更改。可以使用
session\u write\u close()
提前关闭会话


它确实在改变,对
s_write()
s_close()
的调用被记录在另一个目录中

废话!被PHP自己放在那里的通知抓住了!引用手册:

警告

如果在脚本终止中关闭了会话,则当前工作目录将使用一些SAPI进行更改。可以使用
session\u write\u close()
提前关闭会话

它确实在改变,对
s_write()
s_close()
的调用被记录在另一个目录中

<?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();
?>