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

Posted

技术标签:

【中文标题】Zend Framework 应用程序中的“会话已启动....”异常【英文标题】:"session has already been started...." exception in Zend Framework application 【发布时间】: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) 不同的配置 或不同的服务器设置...... 【参考方案1】:

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

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

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

    删除除一个以外的所有事件。要注意它是否已经启动,请设置error_reporting(E_ALL|E_STRICT); 在所有地方将其替换为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 folder 或http://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 个:

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

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

#25 "session has already been started by session.auto-start or session_start()" error message is misleading

【讨论】:

【参考方案12】:

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

【讨论】:

以上是关于Zend Framework 应用程序中的“会话已启动....”异常的主要内容,如果未能解决你的问题,请参考以下文章

Zend Framework 1 应用程序中的缓存破坏静态资产

DQL 语句在使用 Zend Framework 和 Doctrine 的应用程序中的位置

php - Zend Framework中的冲突视图助手名称

我在 Zend Framework 中的哪里保存部分(视图),以便我的应用程序中的所有视图都可以访问?

如何使用Zend Framework 2使用Rest API

禁用Zend Framework中的视图和布局