【问题标题】:Unexpected Exception session has already been started by session auto-start or session_start()会话自动启动或 session_start() 已启动意外异常会话
【发布时间】:2010-12-08 18:11:17
【问题描述】:

我无法在需要时重现此异常。它只是偶尔发生一次,在测试站点导航时。它可能发生在任何页面,无论用户是否登录,没有 问题。

由于这个错误完全丢失。

至少,我可以帮忙看看我应该去哪里看看有什么问题吗?

在 Zend 中,我们在哪里设置临时目录来存储会话变量?

谢谢,
内存

【问题讨论】:

    标签: zend-framework exception


    【解决方案1】:

    我最近在 Dreamhost 上遇到了这个问题。我把它归结为会话路径不可写。我向 Dreamhost 支持发送了电子邮件,但他们没有响应,因此我需要更改会话在文件系统中的保存路径。

    在 application.ini 中:

    resources.session.save_path = APPLICATION_PATH "/../tmp/session"
    

    这为我修复了异常。我希望它也适合你!

    【讨论】:

    • 我遇到了类似的问题,我在 application.ini 中拼错了会话目录名称,并收到“会话已启动”错误。您的回答使我走上了正确的道路,我检查了目录名称并注意到了错字。修复它,一切都开始工作了。谢谢!
    【解决方案2】:

    首先,确保 php 没有自动启动。

    php.ini (or ini_set in your index.php):
    session.auto_start = 0
    

    其次,在必须使用之前不要使用 session_start() 或 Zend_Session::start()。如果你确实使用它们,你只能使用它们一次,否则你会得到一个会话已经开始的错误。

    第三,尽量只在需要的时候使用 Zend_Session_Namespace,甚至不使用上面的启动命令。 (主要在控制器中)

    第四,你可以使用你的application.ini配置会话资源

      resources.session.save_path = APPLICATION_PATH "/../data/session"
      resources.session.use_only_cookies = true
      resources.session.remember_me_seconds = 864000
    

    有关资源的更多信息: http://framework.zend.com/manual/en/learning.multiuser.sessions.html

    希望对您有所帮助:)

    【讨论】:

      【解决方案3】:

      这似乎与 Zend 尝试执行的会话清理任务有关。默认情况下,apache 仅具有对会话目录的写入权限(在 Ubuntu 机器上,它将是 /var/lib/php5)。这会导致清理失败,从而导致间歇性 HTTP/500 错误。

      最简单的方法是通过以下任一方式授予对 apache 的读取权限

      1. chmod a+r /var/lib/php5
      2. chgrp www-data /var/lib/php5; chmod g+r /var/lib/php5

      以上命令假设您运行的是 Ubuntu。在其他发行版中,调整用户名/路径。

      【讨论】:

        【解决方案4】:

        session_start()Zend_Session::start() 之前被调用,或者启用了PHP 配置标志session_auto_start 时,会发生此错误。确保该标志被禁用并且您的代码(或您使用的任何库,除了 ZF)没有调用 session_start()

        【讨论】:

          【解决方案5】:

          如果您正在使用 RPCL 库 (RADPHP) 开发应用程序并收到此错误:

          应用程序引发了异常类 Zend_Session_Exception,消息为“会话已由 session.auto-start 或 session_start() 启动”,

          那么这是我的解决方案。

          您会惊讶于它是多么简单。简单的包含行

          require_once("zcommon.inc.php");

          就在包含 ZAuth 组件的文件中的开始 PHP 标记之后——通常这是具有 DataModule 形式的文件。当然,请确保文件 zcommon.inc.php 在您的路径中。这将确保 Zend 会话将首先启动,而不是 RPCL 会话。

          还要使应用程序中的 php 文件的名称与包含的类的名称相对应。

          【讨论】:

            【解决方案6】:

            您使用的是 Debian/Ubuntu 机器吗?

            如果是这样,您的问题可能与会话的自动垃圾收集有关。 尝试通过在 php.ini 文件中设置来禁用它:

            session.gc_probability = 0
            

            请参阅http://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu-session-phpini-garbage 了解更多信息。

            【讨论】:

              【解决方案7】:

              照阿伦说的做补充:

              resources.session.save_path = APPLICATION_PATH "/../temp/session"
              

              到应用程序 ini。确保您拥有该文件夹。为我工作!

              我还补充了:

              phpSettings.session.auto_start = 0
              

              到应用程序 ini。不确定这是否有帮助。

              【讨论】:

                猜你喜欢
                • 2011-10-06
                • 2016-05-01
                • 1970-01-01
                • 2013-07-23
                • 2020-06-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-08-05
                相关资源
                最近更新 更多