使用回调从 php4 迁移会话到 php5 的奇怪行为
我必须将使用 session_set_save_handler()
的 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();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这实际上在文档中指出:
本质上,您必须从
SomeObject
的析构函数中调用session_write_close()
,或者执行以下操作:这些解决方案中的任何一个都应该强制写入和关闭所有对象被销毁之前的会话,允许您保留原始的回调函数。
This is actually noted in the documentation:
Essentially, you'll have to call
session_write_close()
from the destructor of yourSomeObject
, or alternatively, do the following:Either of those solutions should force the writing and closing of the session before all objects are destroyed, allowing you to keep your original callback function.
莫尔夫的回答指出了问题所在。 以下是更多信息:
session_write_close()
将标识符及其关联数据作为输入。 如果您想要进行最小的更改,您可能需要知道数据是session_encode()
返回的数据(它是对 $_SESSION 数组的内容进行编码的字符串)。 该标识符是session_id()
返回的内容。Molf's answer identifies the problem. Here's some more info:
session_write_close()
takes as input an identifier and the data associated with it. If you're going for minimal change, you'll probably need to know the data is what is returned bysession_encode()
(which is a string encoding the contents of the $_SESSION array). The identifier is what is returned bysession_id()
.