奇怪的行为使用回调从php4到php5迁移会话

时间:2009-07-05 21:51:14

标签: php session callback migration php4

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

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

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

对于此行为是否有一些解释,或者您是否可以提示使用从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();

2 个答案:

答案 0 :(得分:3)

实际上已在documentation中注明:

  

从PHP 5.0.5开始,write和close处理程序在对象销毁后被调用,因此不能使用对象或抛出异常。但是,对象析构函数可以使用会话。

     

可以从析构函数中调用session_write_close()来解决鸡和蛋的问题。

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

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

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

答案 1 :(得分:0)

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

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