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

我正在尝试用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()的条目。

<*>SESSION['time']) ) echo 'Session time: ' . date('Y-m-d h:i:s',

我正在尝试用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()的条目。

<*>SESSION['time']); else echo 'Session empty'; echo '<br>'; echo 'Session ID: ' . session_id();

我正在尝试用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()的条目。

<*>SESSION['time'] = time(); ?>
有帮助吗?

解决方案

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

  

警告

     

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top