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();
        }
    }
}

person Andrew    schedule 13.10.2010    source источник


Ответы (7)


Из памяти эта ошибка обычно возникает из-за того, что код, отличный от PHP, запускает вывод раньше, чем предполагалось (и инициализация сеанса). Обычно это происходит из-за пробелов или возврата каретки после ненужных тегов ?>. Это первое, что я бы проверил.

person Maltronic    schedule 13.10.2010

Ошибка звучит так, будто вы не запускаете Zend_Session до того, как данные будут отправлены в браузер. Обычно у меня есть что-то вроде того, что я вставил ниже в свой бутстрап, чтобы запустить Zend_Session.

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

Это должно помочь вам перейти в Zend Framework. Если вы используете этот инструмент вне фреймворка, просто используйте эту внутреннюю строку кода в верхней части ваших PHP-скриптов, прежде чем выводить или печатать что-либо.

Надеюсь, это поможет!

person gokujou    schedule 13.10.2010

Я нашел похожий пост по этой проблеме:

Вывод PHPUnit, вызывающий исключения Zend_Session

У меня была такая же проблема, но решение, которое было предложено по предыдущей ссылке, у меня не сработало, поэтому после некоторого тестирования я обнаружил, что в классе Zend_Session есть переменная

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

Если вы установите для этой переменной значение «true», выполнение phpunit будет работать без проблем. По крайней мере, так произошло в моем случае.

Надеюсь, это поможет

person jameslimousin    schedule 12.12.2011

Я столкнулся с той же проблемой, и моя проблема заключалась в том, что я повторял СТРОГОЕ предупреждение, которое выводилось на экран.

Хороший способ решить эту проблему — использовать ob_start() и ob_get_contents();.

Надеюсь, поможет

person bclarance    schedule 12.03.2012

По какой-то причине я пытался установить некоторую переменную сеанса в моем файле index.php после того, как приложение завершило загрузку. Не знаю, почему раньше это не вызывало проблем, но когда я удалил это из своего index.php, это сработало.

$userSession = new Zend_Session_Namespace('Auth');
$userSession->forcePasswordChange = false;
person Andrew    schedule 14.10.2010
comment
Попытка использовать сеанс требует, чтобы Zend_Session был запущен с кодом, который я перечислил выше. Я думал, вы использовали сессию намеренно. Но если нет, удаление, как вы сказали здесь, столь же эффективно. - person gokujou; 15.10.2010

Возможно, сеанс запускается через ваш application.ini или php.ini (автозапуск сеанса)? Если вы используете ide, попробуйте выполнить поиск по «пробелам».

Иногда помогает поиск " " (с пробелами).

person opHASnoNAME    schedule 14.10.2010

У меня было такое же сообщение об ошибке. Но только на одно действие. Проблема была вызвана этими двумя строками в действии контроллера:

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

В моей базе было более 6000 клиентов. Так что нехорошо нажимать много записей для просмотра.

person user2351471    schedule 12.03.2015