【问题标题】:"session has already been started...." exception in Zend Framework applicationZend Framework 应用程序中的“会话已启动....”异常
【发布时间】:2011-01-25 23:07:20
【问题描述】:

尝试加载 Zend Framework 应用程序时出现此错误:

致命错误:未捕获的异常 带有消息的“Zend_Session_Exception” '会话已经由 session.auto-start 或 session_start()' 在 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php:462

堆栈跟踪:

#0 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session/Namespace.php(143): Zend_Session::start(true)

#1 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace->__construct('Zend_Auth')

#2 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(91): Zend_Auth_Storage_Session->__construct()

#3 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(141): Zend_Auth->getStorage()

#4 /www/htdocs/w00a1ed7/autospin/redaktion/application/layouts/scripts/layout.phtml(31): Zend_Auth->hasIdentity()

#5 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View.php(108): 包括('/www/htdocs/w00...')

#6 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View/Abstract.php(831): Zend_View->_run('/www/htdocs/w00...')

#7 /www/htdocs/w00a1ed 在 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php 第 462 行

我在本地服务器上使用Zend_Auth,它运行良好,但在生产服务器上,我得到了前面的错误,但不是每次都出现。

我检查了session.autostart.htaccess 文件中设置为0

如何解决这个错误?


感谢您的回答,但我不在任何地方使用 session_start()。仅与 ZF 合作。

我只在共享服务器上遇到此问题,在我的本地服务器脚本上运行良好。

我在这段代码中使用 INIT 函数:

受保护的 $user;

public function init()
{   
    if(!Zend_Auth::getInstance()->hasIdentity())
    {
        $this->_redirect('auth/login');
    }else
    {
        $this->user = Zend_Auth::getInstance()->getIdentity();
    }
}

我已经尝试只在 indexAction 中设置 tis 代码,这样其他操作就不必破解 Auth...但仍然有问题。

有没有办法在 Action 中设置不检查会话或类似这样的想法?

最好的问候

【问题讨论】:

  • 我有时也会收到此错误...解决方案会很好:)
  • 我能想到两件事让 live-&dev-servers 显示不同的结果:1) 不完全相同的文件;或 2) 不同的配置
  • 或不同的服务器设置......

标签: php zend-framework session .htaccess zend-auth


【解决方案1】:

这就是它所说的。 Zend_Auth 尝试开始一个新会话,因为尚未调用 Zend_Session::start()

问题是必须在会话开始之前调用Zend_Session::start()。但是,由于 session.autostart 为 0(顺便说一下,这是在 php.ini 而不是 .htaccess),你可能在某处写了 session_start();。不允许您这样做,因为 ZF 希望完全控制会话,即您不应该直接访问全局会话变量。

要解决这个问题,请在您的代码文件中搜索 session_start() 或者

  1. 删除除一个以外的所有事件。要注意它是否已经启动,请设置error_reporting(E_ALL|E_STRICT);
  2. 在所有地方将其替换为Zend_Session::start();

如果找不到所有的出现,找到一个 session_start();困扰您的Zend_Auth::getInstance()->hasIdentity() 并使用以下 sn-p 快速解决问题

try {
    Zend_Session::start();
} catch(Zend_Session_Exception $e) {
    session_start();
}

如果您在整个应用程序中使用 ZF,我会选择 2)

【讨论】:

  • 我试过这个尝试 { Zend_Session::start(); if(!Zend_Auth::getInstance()->hasIdentity()) { $this->_redirect('auth/login'); }else { $this->user = Zend_Auth::getInstance()->getIdentity(); } } catch(Zend_Session_Exception $e) { session_start();并且它工作得最好,但我仍然有问题,有时请求页面是空的......
  • 不错!如果对您有帮助,请随意将答案标记为正确 :) 请记住,请相信堆栈跟踪,它通常是您最好的朋友 ;)
  • FACEBOOK SDK 有 session_start()!
  • 我只是想向其他人指出,facebook sdk 可能是问题的原因,facebook sdk 已经有 if()... 但是我仍然遇到错误,直到我将其更改为 Zend_Session ::开始()
  • @max4ever:我真的认为 ZF 在这件事上设计得很糟糕,你可能是对的。在这种情况下,ZF 应该更松散耦合。 (每次更新 FB SDK 时,您可能都必须重做更改。)
【解决方案2】:

我遇到了同样的问题,搜索了包括这篇文章在内的所有帖子,直到我发布虽然我有相同的异常结果,但我的错误是由完全不同的东西引起的。

我实际上遇到了自动加载问题。由于 Bootstrap 期间的问题,我相信这会导致显示上述异常(隐藏真正的错误)。

因此,如果您完成了所有其他可能的修复,请尝试在 Bootstrap 中注释掉详细信息,看看是否可以解决此问题。显然,您慢慢地带回引导程序的不同部分以发现真正的问题。

【讨论】:

    【解决方案3】:

    有同样的错误。仅当同时使用同一会话的两个实例时才会发生这种情况(例如,同时加载两个浏览器实例)。这是由于 php 无法同时处理两个具有相同 id 的打开会话。

    【讨论】:

      【解决方案4】:

      我有同样的错误。在本地机器上,一切正常。在服务器上没有。 我的解决方案是在运行引导程序之前将Zend_Session::start(); 放在 index.php 中。所以它看起来像这样:

      <?php
      // Define path to application directory
      defined('APPLICATION_PATH')
          || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
      
      // Define application environment
      defined('APPLICATION_ENV')
          || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
      
      // Ensure library/ is on include_path
      set_include_path(implode(PATH_SEPARATOR, array(
          realpath(APPLICATION_PATH . '/../library'),
          get_include_path(),
      )));
      
      /** Zend_Application */
      require_once 'Zend/Application.php';  
      
      // Create application, bootstrap, and run
      $application = new Zend_Application(
          APPLICATION_ENV, 
          APPLICATION_PATH . '/configs/application.ini'
      );
      
      error_reporting(E_ALL);
      ini_set("display_errors", 1);
      
      Zend_Session::start();
      
      $application->bootstrap()->run();
      

      【讨论】:

        【解决方案5】:

        适用于从一台服务器移动到另一台服务器的用户。另一个问题可能是运行 apache 的用户。我在新盒子上设置的旧盒子上运行了一个不同的用户。我使用了旧 httpd.conf 中的配置,忘记更新 /var/lib/php/session 上的权限以反映不同的用户。

        为了测试,我将 perms 更改为 777。一切正常,错误消失了:

        # cd /var/lib/php
        # chmod 0777 session
        

        所以我退回了烫发并更改了组。当然,将 newApacheUser 更改为您在 IF NOT apache 上运行 httpd 的用户帐户。

        # chmod 0770 session
        # chown root:newApacheUser session
        

        如果您仍然遇到此问题,请检查一下:

        致命错误:未捕获的异常“Zend_Session_Exception”带有消息“会话已由 session.auto-start 或 session_start() 启动”

        【讨论】:

          【解决方案6】:

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

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

          那么这是我的解决方案。

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

          require_once("zcommon.inc.php");

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

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

          【讨论】:

            【解决方案7】:

            我想提请您注意垃圾收集问题,在这里Issues with PHP 5.3 and sessions folderhttp://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu-session-phpini-garbage 已解决。

            修复“会话已启动”后,我遇到了 GC 错误。我怀疑至少在某些情况下,GC 错误可能是会话错误的根本原因。到目前为止,我还没有足够的时间进行彻底调查,但如果 GC 和会话错误也与您的案例相关,请发表评论。

            【讨论】:

              【解决方案8】:

              在这让你发疯之前,你的代码可能没有任何问题!

              检查您的 application.ini 中的会话保存路径,对我来说是 APPLICATION_PATH '/会话'

              现在检查您是否拥有正确的权限! 如果没有,则 cd 进入应用程序文件夹并键入

              sudo chmod 777 会话 sudo chown -R [usernamehere] 会话 sudo chgrp -R [usernamehere] 会话

              任务完成!

              【讨论】:

              • 我注意到,有时当 PHP 无法写入文件/目录时,它抛出的错误可能会有点误导。我遇到了你之前描述的问题。
              • “嗯,它说德克萨斯有雷暴。我们该怎么办???” “别慌,儿子。这实际上只是意味着我的轮胎气压低。”
              • 该错误具有误导性。这让我走上了正确的道路,谢谢!确保会话文件夹存在。
              • 你为什么要让它为每个人读/写/执行?
              【解决方案9】:

              产生此问题的主要原因有 3 个:

              1. session.auto_start 应设置为 0 或关闭。您可以通过放置 phpinfo(); 来检查它。在任何文件中并尝试在浏览器中访问它,然后搜索 auto_start 是 0 还是关闭。如果没有,则将其设置为关闭或 0。
              2. 检查服务器配置中的会话路径 session.save_path。如果使用默认配置显示错误“会话已由 session.auto-start 或 session_start() 启动”,请将其设置为“/temp”
              3. 可能是您在 Zend 会话初始化之前在代码中使用了 session_start()。

              在大多数情况下,第二个选项是原因。

              【讨论】:

                【解决方案10】:

                如果有任何用处,我通过从我的 application/config/application.ini 中取出与会话相关的行来清除此错误

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

                感谢chelmertz 深入了解问题的原因。

                【讨论】:

                • 这似乎不是OP问题的核心问题。
                【解决方案11】:
                【解决方案12】:

                问题可能与session.save_path 有关。你可以试试ini_set('session.save_path', 'path-to-your-session-storage-directory');

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-11-29
                  • 1970-01-01
                  • 2022-10-14
                  相关资源
                  最近更新 更多