Zend Framework应用程序中的“会话已经启动....”异常

时间:2010-03-10 15:31:58

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

尝试加载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(真)

     

#1 / www / htdocs /w00a1ed7 / autospin / redaktion / library / Zend / Auth / Storage / Services.php(87):   Zend_Session_Namespace-> __构建体( 'Zend_Auth的')

     

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

     

#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文件中的0已设为.htaccess

如何解决此错误?


感谢您的回答,但我没有在任何地方使用session_start()。仅适用于ZF。

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

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

protected $ user;

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

我已经尝试仅在indexAction中设置tis代码,以便其他操作不必查看Auth ...但仍然有问题。

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

Beste问候

12 个答案:

答案 0 :(得分:18)

在你激动之前,你的代码可能没什么问题!

检查你的application.ini以获取会话保存路径,对我而言 APPLICATION_PATH'/ session'

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

sudo chmod 777 session
sudo chown -R [usernamehere] session
sudo chgrp -R [usernamehere] session

工作完成!

答案 1 :(得分:15)

这就是它所说的。 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();替换
  3. 如果找不到所有匹配项,请找到一个session_start();困扰你的Zend_Auth::getInstance()->hasIdentity()并使用以下代码段快速解决问题

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

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

答案 2 :(得分:11)

我有同样的错误。在本地机器上,一切正常。在服务器上没有。 我的解决方案是在运行bootstrap之前将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();

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

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

  

应用程序引发了一个异常类Zend_Session_Exception,消息'session已经由session.auto-start或session_start()'启动,

然后这是我的解决方案。

你会惊讶它有多简单。简单包括行

  

require_once( “zcommon.inc.php”);

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

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

答案 5 :(得分:2)

我想提请你注意垃圾收集问题,这里解决了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和会话错误是否也与您的情况有关。

答案 6 :(得分:1)

有同样的错误。只有在同一时间使用同一会话的两个实例时才会出现(例如,两个浏览器实例同时加载)。这是因为php无法同时处理具有相同ID的两个打开会话。

答案 7 :(得分:1)

对于从一台服务器移动到另一台服务器的人。另一个问题可能是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已由session.auto-start或session_start()启动

答案 8 :(得分:1)

如果有任何使用,我通过从我的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了解问题原因。

答案 9 :(得分:1)

答案 10 :(得分:1)

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

答案 11 :(得分:0)

我遇到了同样的问题并搜索了所有的帖子,包括这个帖子我找不到答案,直到我发布了虽然我有相同的异常结果,但我的错误是由完全不同的事情造成的。

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

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