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 中的哪里保存部分(视图),以便我的应用程序中的所有视图都可以访问?