您好我的会话使用Zend Framework 1.7.6。
当我尝试将数组存储到会话时存在问题,会话命名空间也存储其他用户数据。
我目前在stacktrace中收到以下消息
Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'Zend_Session::start() - ... Error #2 session_start() [function.session-start]: Node no longer exists Array
我认为这是错误的代码是:
//now we add the user object to the session
$usersession = new Zend_Session_Namespace('userdata');
$usersession->user = $user;
//we now get the users menu map
$menuMap = $this->processMenuMap($menuMapPath);
$usersession->menus = $menuMap;
自从尝试将数组添加到会话命名空间后,此错误才开始出现。
任何想法可能导致节点不再存在数组消息?
非常感谢
答案 0 :(得分:3)
您是否尝试在会话数据中存储SimpleXML对象或其他与libxml相关的内容?
这不起作用,因为在session_start()
期间对对象进行反序列化时,不会恢复基础DOM树。而是存储xml文档(作为字符串)。
你可以实现这一点,例如提供"magic functions" __sleep()
and __wakeup()
。但是__sleep()
必须返回一个数组,其中包含要序列化的所有属性的名称。如果添加另一个属性,则还必须更改该数组。这消除了一些自动化......
但是如果你的menumap类只有几个属性,那么对你来说可能是可行的。
<?php
class MenuMap {
protected $simplexml = null;
protected $xmlstring = null;
public function __construct(SimpleXMLElement $x) {
$this->simplexml = $x;
}
public function __sleep() {
$this->xmlstring = $this->simplexml->asXML();
return array('xmlstring');
}
public function __wakeup() {
$this->simplexml = new SimpleXMLElement($this->xmlstring);
$this->xmlstring = null;
}
// ...
}
答案 1 :(得分:1)
您应该在会话中存储XML字符串。或者,您可以围绕该XML字符串创建一个包装类:
在这些方法中,您可以关注对象的状态。