【问题标题】:Calling session_write_close() before Zend_Session::start() in the bootstrap causes an error在引导程序中的 Zend_Session::start() 之前调用 session_write_close() 会导致错误
【发布时间】:2011-07-24 17:49:02
【问题描述】:

所以我需要从 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() 来关闭会话,据我从我的google-fu 中得知,重新启动之前的会话没有任何问题。那么为什么会窒息呢?是采埃孚特有的吗?我还需要做些什么来关闭会话吗?什么给了?

【问题讨论】:

  • 虽然我认为没有什么能阻止您关闭和重新打开会话,但我从未见过有人在此过程中实际切换会话存储方法。说到存储方式,这个问题和the last question you asked about ZF's session handling有什么显着不同?确实,同样的解决方案仍然适用:停止将会话存储在数据库中(从而安装会话处理程序)。
  • @Charles 我无法使用该解决方案。对不起,不是我的电话。我需要一个允许我使用数据库保存的解决方案。
  • @Charles 我想这仍然是同一个问题,只是研究了很长时间,尝试了很多不同的东西,感觉就像一个全新的问题!
  • @Daniel,我对困难的失控方面表示哀悼。我不认为这是可以解决的。您能告诉我们更多关于旧版应用程序中的会话数据的信息吗?可能有一些明智的方法可以获取这些数据,而不会试图让 PHP 向后弯曲。
  • 我认为您必须使用 2 个无法在同一个 http 请求中关闭/打开会话的请求来处理此问题。

标签: php zend-framework session


【解决方案1】:

你做不到。

首先,如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 不支持您执行此操作的方式(如建议:使用两个不同的请求或使用批处理脚本)。

【讨论】:

    【解决方案2】:

    我今天遇到同样的问题,所以我读了你的博客,但还是做了研究,所以我找到了一个方法与你分享。

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

    "Zend_Session::start();"会话关闭后不起作用,因此您可以使用 php session_start();

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2021-02-20
      • 1970-01-01
      相关资源
      最近更新 更多