2

我必须将一个使用 php4 的应用程序迁移session_set_save_handler()到 php5。

在 php4 中一切都很好,但在 php5 中,回调函数无法再访问全局变量,这些变量是在session_set_save_handler()调用之前在页面上设置的。

在下面的示例中,无法访问全局变量 $g1 session_writer()(作为回调函数传递)

对此行为是否有一些解释,或者您能否提供有关将带有回调的会话从 php4 迁移到 5 的提示?

这是伪代码:

function session_writer($id,$vars) {
  global $g1;
  echo "g1 not defined here: ".is_object($g1);
}

global $g1;
$g1 = SomeObject(); //which is the DB connection for the session writer

session_set_save_handler($o,$c,$r,"session_writer",$d,$g);
session_start();
4

2 回答 2

3

这实际上在文档中注明:

自 PHP 5.0.5 起,write 和 close 处理程序在对象销毁后调用,因此不能使用对象或抛出异常。然而,对象析构函数可以使用会话。

可以session_write_close()从析构函数调用来解决这个先有鸡还是先有蛋的问题。

本质上,您必须session_write_close()从您的析构函数中调用SomeObject,或者执行以下操作:

<?php register_shutdown_function("session_write_close"); ?>

这些解决方案中的任何一个都应该在所有对象被销毁之前强制会话的写入和关闭,从而允许您保留原始回调函数。

于 2009-07-05T21:59:17.063 回答
0

莫尔夫的回答确定了问题所在。这里有更多信息:

session_write_close()将标识符和与之关联的数据作为输入。如果您要进行最小的更改,您可能需要知道数据是返回的session_encode()内容(这是一个编码 $_SESSION 数组内容的字符串)。标识符是由 . 返回的内容session_id()

于 2012-02-16T23:27:50.343 回答