Zend抛出“Session已经开始”异常,当我还没有开始会话时,会给出什么?

时间:2011-07-23 18:31:23

标签: php zend-framework session

Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'session has already been started by session.auto-start or session_start()' in /usr/include/ZendFramework-1.11.3/library/Zend/Session.php on line 462

每次重新加载都会发生。我做过的事情:

  • 确保我的php.ini
  • 中的session.autostart = 0
  • 在我的整个应用程序中搜索了对session_start()的调用,没有
  • 将以下会话配置信息放在我的config.ini中:

    resources.session.save_path = APPLICATION_PATH "/../data/session"
    resources.session.use_only_cookies = true
    resources.session.remember_me_seconds = 864000
    
  • 从我的config.ini中删除了以上内容,没有什么区别

  • 重启apache,好几次
  • 最后我只使用Zend_Session_Namespace(),它在我的控制器的init()函数中初始化。

我每次都会收到这个错误。是什么赋予了?还有什么我没检查过?在我的应用程序(Zend库之外)中,“session”这个单词的唯一位置就在这个控制器中:

<?php

class ContributeController extends Zend_Controller_Action
{
    private $_session;

    private function getSession() {
        return $this->_session;
    }

    public function init()
    {
        $this->_session = new Zend_Session_Namespace('contribute');
    }

    public function indexAction()
    {
        // action body
    }

    public function addAction() {
        $this->getSession()->form = new Application_Form_Contribute_Add_Main();
        $this->view->form = $this->getSession()->form;
    }

    public function importAction() {}


}

?>

这是我的^session的php.ini的grep搜索:

session.save_handler = files
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly = 
session.serialize_handler = php
session.gc_divisor     = 100
session.gc_maxlifetime = 1440
session.bug_compat_42 = 1
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 4

session.auto_start,显然已关闭。

为什么我每次都会收到此错误?这是怎么回事?

编辑目前看来这是因为我尝试存储该表单时尝试在会话中存储太多而导致这种情况。当我重写我的代码来存储一个非常简单的数组,而不是概述表单的结构时,错误消失了并且没有返回。如果它再次出现我可能会回到这里,我不相信它还没有。

3 个答案:

答案 0 :(得分:2)

检查application.ini中定义的会话数据文件夹是否存在且是否可写:如果不是这种情况,则会出现与此伪造消息相同的异常。

答案 1 :(得分:1)

我唯一可以想到你可能忽略的是,你的应用程序中的这个调用(也许是bootstrap?):

Zend_Session::start();

答案 2 :(得分:1)

好的,如何将debug_trace()转储到Zend_Session_Namespace构造函数中的文件中,并查看每个请求获得的内容。这至少应该告诉你原因不在Zend之内,或者确实存在两个紧密的呼叫,特别是它们来自哪里。

我想到你在内部重新加载表单页面导致init()控制器运行两次。早期开始会话就像在bootstrap中建议的karim79一样可以治愈这种情况。