【问题标题】:Zend throws "Session already started" exception, when I have not started a session, what gives?Zend 抛出“会话已经开始”异常,当我还没有开始会话时,什么给出?
【发布时间】:2011-10-11 18:14:17
【问题描述】:
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 库之外)中甚至存在“会话”一词的唯一位置是在这个控制器中:

<?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() {}


}

?>

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

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,显然是关闭了。

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

编辑 目前看来,这是由于在我尝试存储该表单时尝试在会话中存储太多而引起的。当我重写我的代码以存储一个非常简单的数组来概述表单的结构时,错误消失了并且没有返回。如果它再次出现,我可能会回到这里,但我不确定它是否还不会。

【问题讨论】:

  • 你能解释一下“每次重新加载都会发生”吗?
  • @Adrian World - 我认为他的意思是“在每次请求时”,或者每次他点击页面时。
  • @Adrian World karim79 是正确的。
  • 因为你已经为session.auto-start grep 了你的php.ini(提示:检查phpinfo() 以及源代码它是一个PHP_INI_ALL 设置),你可以另外grep session_start 的来源也是如此。
  • 嗯,&lt;?php 标签前的空格或 bom 签名呢?

标签: php zend-framework session


【解决方案1】:

检查您的 application.ini 中定义的会话数据文件夹是否存在且可写:如果不存在,则此虚假消息会引发相同的异常。

【讨论】:

  • 我遇到了这个确切的问题。我的配置文件中的会话路径名有错字。在这种情况下,它确实不是一个有用的错误消息。
【解决方案2】:

我能想到的唯一一件您可能忽略的事情,就是您的应用程序中某处的这个调用(也许是引导程序?):

Zend_Session::start();

【讨论】:

  • 我试过了。在引导程序中调用它失败。在$application 之前调用它有时会起作用,但在某些刷新时仍会弹出错误。即便如此,这感觉就像是一个黑客和创可贴,并不能解释更大的原因。我目前正在测试的一个理论是我的表单对于会话来说太大并导致它在序列化时阻塞。
【解决方案3】:

好的,如何将 debug_trace() 转储到 Zend_Session_Namespace 构造函数中的文件中,然后查看每个请求会得到什么。这至少应该向您表明原因是在 Zend 之外,或者确实有两个密切联系,尤其是它们来自哪里。

我不知何故认为您在内部重新加载表单页面导致 init() 控制器运行两次。像引导程序中建议的 karim79 那样提前开始会话应该可以解决这种情况。

【讨论】:

  • 为什么 new 在 Zend_Session_Namespace() 上调用 new 两次会产生这个错误呢?我应该不能调用它来获取多个命名空间吗?当我在同一个命名空间上调用它并优雅地处理它时,它不应该检测到它吗?
  • 理论上可以,但是 Zend_Session 被重置时有一定的条件。但是我在您上面的更新中看到,您的问题可能不是这种情况。
  • 虽然 Adrian World 没有提到任何条件,但我发现 GC 将收集 Zend_Session,当它仅被准备收集的 Zend_Session_Namespace 对象引用时。当我在引导程序中添加 Zend_Session::start() 调用时,它解决了我的问题。
猜你喜欢
  • 2023-03-23
  • 2019-09-16
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2017-11-20
相关资源
最近更新 更多