【问题标题】:Node no longer exists error with Zend_SessionZend_Session 的节点不再存在错误
【发布时间】:2009-07-05 15:20:38
【问题描述】:

您好,我在使用 Zend Framework 1.7.6 的会话时遇到问题。

当我尝试将数组存储到会话时存在问题,会话命名空间还存储其他用户数据。

我目前在我的堆栈跟踪中收到以下消息

致命错误:未捕获的异常 'Zend_Session_Exception' 带有消息 'Zend_Session::start() - ... 错误 #2 session_start() [function.session-start]: 节点不再存在数组

我认为这是错误的代码是:

//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;

自从尝试将数组添加到会话命名空间后才开始出现此错误。

任何想法可能导致 Node 不再存在 Array 消息?

非常感谢

【问题讨论】:

    标签: php zend-framework session


    【解决方案1】:

    您是否尝试在会话数据中存储 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;
        }
    
        // ...
    }
    

    【讨论】:

    • 我确实使用 simplexml。我的菜单/站点地图存储在 xml 文件中,我尝试将它们存储在存储到数组中的 Menu 对象中。有没有办法可以实现我想要做的事情?
    【解决方案2】:

    您应该将 XML 字符串存储在会话中。或者,您可以围绕该 XML 字符串创建一个包装类:

    在这些方法中,您可以关注对象的状态。

    【讨论】:

    • 在这里实现 Serializable 肯定比我的 __sleep/__wake 示例好。
    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2014-07-27
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多