在引导程序中的Zend_Session :: start()之前调用session_write_close()会导致错误

时间:2011-03-28 19:05:19

标签: php zend-framework session

所以我需要从Zend访问现有的Session。不要问为什么,我不喜欢谈论它。无论如何,我已经发现在初始化会话之前我可以从引导程序访问它。我有以下代码尝试将其拉出并将其转移过来:

 protected function _initSession() {
        session_start();
        $values = $_SESSION;
        session_write_close();

        $db = Zend_Db::factory('Pdo_Mysql', array(
            'host'        =>'localhost',
            'username'    => 'uname',
            'password'    => '******',
            'dbname'    => 'dbname'
        ));
        Zend_Db_Table_Abstract::setDefaultAdapter($db);


        $sessionConfig = array( 
            'name'           => 'Sessions',      
            'primary'        => 'sessionID',   
            'modifiedColumn' => 'lastModifiedTime',     
            'dataColumn'     => 'data',
            'lifetimeColumn' => 'lifetime'
        ); 
        $saveHandler = new Zend_Session_SaveHandler_DbTable($sessionConfig); 
        Zend_Session::setSaveHandler($saveHandler); 
        Zend_Session::start();

        $old = new Zend_Session_Namespace('OLD');
        $old->values = $values;
}

当它命中Zend_Session::start()时声称会话已经启动,这会让人感到窒息。但是我已经打电话给session_write_close()来关闭会话,据我所知,谷歌的重新启动之前已经完成的会话并没有什么问题。那为什么会窒息?它是ZF特有的东西吗?关闭会话还需要做些什么吗?是什么给了什么?

2 个答案:

答案 0 :(得分:0)

你不能。

最重要的是,如ZF documentation

中所述
  

不要直接使用PHP的»session_start()函数。如果直接使用session_start(),然后开始使用Zend_Session_Namespace,则Zend_Session :: start()将抛出异常(“会话已经启动”)。

所以你的代码看起来应该是这样的:

    Zend_Session::start();
    $values = $_SESSION;
    Zend_Session::writeClose();

但是在Zend / Session.php:418中,我们有:

    if (self::$_sessionStarted && self::$_destroyed) {
        require_once 'Zend/Session/Exception.php';
        throw new Zend_Session_Exception('The session was explicitly destroyed during this request, attempting to re-start is not allowed.');
    }

因此,ZF不支持您执行此操作的方式(如建议:使用两个不同的请求或使用批处理脚本)。

答案 1 :(得分:0)

我今天面临同样的问题,所以我读了你的博客,但仍然进行了研究,所以我找到了一种与你分享的方式。

只需使用php“session_start()”而不是“Zend_Session :: start();”

“过Zend_Session :: start();”在会话结束后不起作用,所以你可以使用php session_start();

如果您找到任何好的解决方案,请更新我:)