"сессия уже запущена..." исключение в приложении Zend Framework

Я получаю эту ошибку при попытке загрузить приложение Zend Framework:

Неустранимая ошибка: исключение для исключения 'Zend_Session_Exception' с сообщением сеанс уже запущен session.auto-start или session_start() ' в /www/htdocs/w 00a1ed7/autospin/redaktion/library/Zend/Session.php:462

Трассировка стека:

# 0/www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session/Namespace.php(143): Zend_Session:: заводится (правда)

# 1/www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace → __ конструкт ( 'Zend_Auth')

# 2/www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(91): Zend_Auth_Storage_Session → __ конструкция()

# 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 → _ пробег ( '/WWW/HTDOCS/w00...')

# 7/www/htdocs/w00a1ed в /www/htdocs/w 00a1ed7/autospin/redaktion/library/Zend/Session.php on line 462

Я использую Zend_Auth и на моем локальном сервере, и он работает хорошо, но на рабочем сервере я получаю предыдущую ошибку, но не каждый раз.

Я проверил, что session.autostart установлен в 0 в файле .htaccess.

Как исправить эту ошибку?


Спасибо за ваш ответ, но я не пользователь session_start() нигде. Работайте только с ZF.

У меня есть эта проблема только на общем сервере, на моем локальном сервере script работает отлично.

Я использую функцию INIT с этим кодом:

protected $user;

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

Я все же пытаюсь установить tis-код только в indexAction, так что другим действиям не нужно пытаться использовать Auth... но все еще есть проблемы.

И есть ли способ установить в Action, чтобы не проверять сеанс или что-то вроде этого?

С наилучшими пожеланиями

Ответ 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() и быстро устранит проблему с помощью следующего фрагмента

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

Если вы используете ZF в своем приложении, я бы пошел с 2)

Ответ 2

Прежде чем это сведёт вас с ума, в вашем коде, вероятно, ничего плохого не будет!

Проверьте свой application.ini для пути сохранения сеанса, для меня это APPLICATION_PATH '/session'

Теперь проверьте, есть ли у вас правильные разрешения! Если нет, то cd в папку приложения и введите

sudo chmod 777 session
sudo chown -R [usernamehere] session
sudo chgrp -R [usernamehere] session

Задание выполнено!

Ответ 3

У меня была такая же ошибка. На локальной машине все работало нормально. На сервере нет. Моим решением было поставить 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();

Ответ 4

Существуют три основные причины, которые вызывают эту проблему:

  • session.auto_start должен быть установлен в 0 или выключен. Вы можете проверить его, поставив phpinfo(); в любом файле и попытаться получить к нему доступ в браузере, тогда поиск auto_start будет 0 или выключен. Если нет, установите его или 0.
  • Проверить путь сеанса session.save_path в конфигурации на сервере. Если с настройкой по умолчанию он показывает сеанс с ошибкой, сеанс уже запущен session.auto-start или session_start() ', установите его в'/temp '
  • Возможно, вы использовали session_start() в своем коде перед инициализацией сессии zend.

В большинстве случаев причиной является второй вариант.

Ответ 5

Если вы разрабатываете приложения с помощью библиотеки RPCL (RADPHP), и вы получаете эту ошибку:

Приложение подняло класс исключения Zend_Session_Exception с сообщением 'session уже запущен session.auto-start или session_start()',

то вот мое решение.

Вы будете удивлены, насколько это просто. Простой включает строку

require_once ( "zcommon.inc.php" );

сразу после открытия PHP-тега в файле, содержащем компонент ZAuth - обычно это файл с формой DataModule. Конечно, убедитесь, что файл zcommon.inc.php находится на вашем пути. Это обеспечит запуск первого сеанса Zend вместо сеанса RPCL.

Также убедитесь, что имя php файлов в вашем приложении соответствует имени содержащихся классов.

Ответ 6

Я хотел бы обратить ваше внимание на проблему сбора мусора, которая была решена здесь Проблемы с PHP 5.3 и папками сеансов или http://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu-session-phpini-garbage.

После фиксации "сеанс уже запущен" я столкнулся с ошибкой GC. Я подозреваю, что ошибка GC может быть основной причиной ошибки сессии, по крайней мере, в некоторых случаях. До сих пор у меня не было достаточно времени для тщательного изучения, но, пожалуйста, прокомментируйте, если GC и ошибка сессии связаны и в вашем случае.

Ответ 7

имела ту же ошибку. это происходило только в том случае, если одновременно использовались два экземпляра одного и того же сеанса (например, два экземпляра браузера загружались одновременно). Это связано с тем, что php не может одновременно обрабатывать два открытых сеанса с одним и тем же идентификатором.

Ответ 8

Для тех, кто перемещается с одного сервера на другой. Другой проблемой может быть пользователь, с которым работает apache. Я запускал другого пользователя в моей старой коробке, которая была установлена ​​на новом. Я использовал конфиги из моего старого httpd.conf и забыл обновить разрешения на /var/lib/php/session, чтобы отобразить другого пользователя.

Чтобы проверить, я изменил perms на 777. Все работало нормально, ошибка исчезла:

# cd /var/lib/php
# chmod 0777 session

Итак, я вернул perms и изменил группу. Конечно, измените newApacheUser на учетную запись пользователя, на которой запущен httpd, на IF NOT apache.

# chmod 0770 session
# chown root:newApacheUser session

Что-то, чтобы проверить, есть ли у вас эта проблема:

Неустранимая ошибка: исключение исключений "Zend_Session_Exception" с сообщением "сеанс уже запущен session.auto-start или session_start()"

Ответ 9

В случае любого использования, я очистил эту ошибку, извлекая связанные строки, связанные с сеансом, из моего приложения /config/application.ini

;resources.session.save_path = APPLICATION_PATH "/../data/session"
;resources.session.use_only_cookies = true
;resources.session.remember_me_seconds = 3600

Благодаря chelmertz, чтобы понять причину проблемы.

Ответ 11

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

У меня действительно была проблема с автозагрузкой. Из-за проблемы во время Bootstrap я считаю, что это привело к тому, что приведенное выше исключение отображалось (скрывая реальную ошибку).

Итак, если вы воспользовались всеми другими возможными исправлениями, попробуйте комментировать детали в своем Bootstrap и посмотрите, не пройдет ли эта проблема. Очевидно, вы медленно возвращаете разные части бутстрапа, чтобы выявить настоящую проблему.