PHP中的session_set_save_handler()的奇怪问题

时间:2009-06-20 19:23:33

标签: php session persistence

我正在尝试用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();
?>

1 个答案:

答案 0 :(得分:1)

Blargh!抓住了PHP本身放在那里的通知!引用手册:

  

警告

     

如果在脚本终止中关闭会话,则会使用某些SAPI更改当前工作目录。可以使用session_write_close()提前关闭会话。

确实发生了变化,对s_write()s_close()的调用记录在另一个目录中!