13

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

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

堆栈跟踪:

#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): include('/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在本地服务器上使用 and 它运行良好,但在生产服务器上我收到前面的错误,但不是每次都出现。

我已经检查了文件中的session.autostart设置。0.htaccess

如何修复此错误?


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

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

我将 INIT 函数与此代码一起使用:

受保护的$用户;

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

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

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

最好的问候

4

12 回答 12

20

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

检查您的 application.ini 以获取会话保存路径,对我来说它是 APPLICATION_PATH '/session'

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

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

任务完成!

于 2012-02-10T09:28:30.587 回答
19

这就是它所说的。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()并快速解决问题

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

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

于 2010-03-10T19:22:29.477 回答
12

我有同样的错误。在本地机器上,一切正常。在服务器上没有。我的解决方案是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();
于 2010-11-18T09:18:21.973 回答
4

产生此问题的主要原因有 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() 。

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

于 2012-06-28T14:31:29.730 回答
3

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

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

那么这是我的解决方案。

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

require_once("zcommon.inc.php");

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

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

于 2011-05-27T13:37:25.557 回答
3

我想提请您注意垃圾收集问题,在这里解决了 PHP 5.3 和会话文件夹的问题或http://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu-会话-phpini-垃圾

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

于 2011-11-02T11:10:04.800 回答
2

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

于 2010-10-26T06:50:17.090 回答
2

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

为了测试,我将烫发更改为 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() 启动”

于 2010-11-19T21:43:41.503 回答
2

万一这有什么用,我通过从我的 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深入了解问题的原因。

于 2012-10-28T20:52:07.560 回答
2

有一个针对此问题的问题:

#25 “会话已由 session.auto-start 或 session_start() 启动”错误消息具有误导性

于 2014-12-02T14:03:10.270 回答
2

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

于 2019-11-06T08:24:30.280 回答
1

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

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

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

于 2010-06-30T12:46:28.420 回答