【问题标题】:Weird problem with session_set_save_handler() in PHPPHP 中 session_set_save_handler() 的奇怪问题
【发布时间】: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


    【解决方案1】:

    哇!注意到 PHP 本身已经放在那里的通知!引用手册:

    警告

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2015-12-20
      • 2012-02-02
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多