Zend_Session:必须在将任何输出发送到浏览器之前启动会话

时间:2010-10-13 22:36:14

标签: php zend-framework zend-session

之前我遇到过这个问题,但我不记得如何解决它。我创建了一个简单的骨头(不能得到任何更简单的)控制器,我只是想回应一些东西到浏览器,我收到这条消息:

Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'Session must be started before any output has been sent to the browser ...

这是我的整个控制器。它显示“成功”,但它也显示错误消息。我怎样才能使该错误消息静音,以便我可以简单地向浏览器回应一些内容?

<?php

class CacheController extends Zend_Controller_Action
{
    public function clearAction()
    {
        $this->_helper->layout->disableLayout();
        $this->_helper->viewRenderer->setNoRender();
        try {
            $result = Model_Cache::emptyCache(array('foobar'=>1));

            if ($result['status'] == true) {
                echo 'Success';
            } else {
                echo 'Error: ' . $result['message'];
            }
        } catch (Exception $e) {
            echo 'Error: ' . $e->getMessage();
        }
    }
}

7 个答案:

答案 0 :(得分:6)

从内存中,此错误通常是由于非PHP代码在预期(和会话初始化)之前启动输出。通常是由于在不必要的?>标签之后的空格或回车。这是我要检查的第一件事。

答案 1 :(得分:4)

它所说的错误是你在数据发送到浏览器之前没有启动Zend_Session。通常我会在我的引导程序中粘贴下面的东西来启动Zend_Session。

protected function _initSessions()
{
    Zend_Session::start();
}

这应该让你进入Zend Framework。如果您在框架之外使用此工具,只需在回显或打印任何内容之前使用PHP脚本顶部附近的内部代码行。

希望有所帮助!

答案 2 :(得分:2)

我在这个问题上找到了类似的帖子:

PHPUnit output causing Zend_Session exceptions

我遇到了同样的问题但是在前一个链接上提出的解决方案对我没有用,所以经过一些测试我发现Zend_Session类上有一个变量

 /**
 * Whether or not Zend_Session is being used with unit tests
 *
 * @internal
 * @var bool
 */
public static $_unitTestEnabled = false;

如果将此变量设置为“true”,则phpunit执行没有任何问题。至少这就是我的情况。

希望这个帮助

答案 3 :(得分:1)

出于某种原因,我试图在应用程序完成引导后在我的index.php文件中设置一些会话变量。不确定之前为什么这不会导致问题,但是当我从我的index.php中删除它时,它确实有效。

$userSession = new Zend_Session_Namespace('Auth');
$userSession->forcePasswordChange = false;

答案 4 :(得分:1)

我遇到了同样的问题,我的问题是我正在回应正在放到屏幕上的STRICT警告。

调试此问题的好方法是使用ob_start()ob_get_contents();

希望有所帮助

答案 5 :(得分:0)

可能会通过您的application.ini或php.ini(会话自动启动)启动会话吗?如果您使用ide尝试搜索“空格”。

有时候搜索“”(带空格)有帮助。

答案 6 :(得分:0)

我有同样的错误消息。但只针对一个动作。控制器操作中的这两行引起了问题:

$customersModel = new Default_Model_DbTable_Customers();
$this->view->customers = $customersModel->fetchAll();

在我的数据库中超过6000个客户。因此,要查看大量记录并不好。