2009-07-05 119 views
2

我必须迁移一个php4应用程序,使用session_set_save_handler()到php5。奇怪的行为迁移会话与回调从php4到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(); 

回答

3

这在实际上documentation注意到:

自PHP 5.0.5写入和关闭对象的处理程序破坏之后称为,因此不能使用对象或抛出异常。对象析构函数可以使用会话。

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

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

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

无论这些解决方案应该强制会话的写作和闭幕前的所有的对象都被破坏,让你保持原来的回调函数。

+0

谢谢,我开始掌握这里发生的事情。 SomeObject()是我的数据库。所以我可以重构并将DB对象的创建复制到session_writer本身,这会是最简单的吗? – user89021 2009-07-05 22:10:53

0

Molf的答案确定了问题。以下是一些更多信息:

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