исключение "сеанс уже запущен ...." в приложении Zend Framework - PullRequest
11 голосов
/ 10 марта 2010

Я получаю эту ошибку при попытке загрузить приложение 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 :: заводится (правда)

# 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/w00a1ed7/autospin/redaktion/library/Zend/Session.php по линии 462

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

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

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


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

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

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

защищенный пользователь $;

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

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

Есть ли способ установить в действии, чтобы не проверять сессию или что-то подобное?

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

Ответы [ 11 ]

18 голосов
/ 10 февраля 2012

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

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

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

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

Работа выполнена!

15 голосов
/ 10 марта 2010

Это то, что говорится. Zend_Auth пытается начать новый сеанс, поскольку Zend_Session::start() еще не был вызван.

Проблема в том, что Zend_Session::start() должен быть вызван до начала сеанса. Но, поскольку session.autostart равен 0 (кстати, это php.ini , а не .htaccess ), вы, вероятно, где-то написали session_start();. Вам не разрешено это делать, поскольку ZF желает иметь полный контроль над сеансами, т. Е. Вам не следует напрямую обращаться к глобальной переменной сеанса.

Чтобы решить эту проблему, найдите в файлах кода session_start() и либо

  1. удалить все случаи, кроме одного. Чтобы заметить, если он уже запущен, установите error_reporting(E_ALL|E_STRICT);
  2. заменить его на Zend_Session::start(); во всех местах

Если вы не можете найти все вхождения, найдите один session_start (); который беспокоит ваш Zend_Auth::getInstance()->hasIdentity() и быстро решает проблему, используя следующий фрагмент

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

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

11 голосов
/ 18 ноября 2010

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

Существует 3 основных причины возникновения этой проблемы:

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

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

2 голосов
/ 02 ноября 2011

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

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

2 голосов
/ 27 мая 2011

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

Приложение вызвало класс исключения Zend_Session_Exception с сообщением «сессия уже запущена сессией .auto-start или session_start ()»,

тогда вот мое решение.

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

require_once ( "zcommon.inc.php");

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

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

1 голос
/ 02 декабря 2014

Для этой проблемы открыт вопрос:

# 25 "сессия уже была запущена сессией

1 голос
/ 29 октября 2012

В случае, если это имеет какое-либо использование, я очистил эту ошибку, удалив строки, связанные с сеансом, из моего 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 за понимание причины проблемы.

1 голос
/ 20 ноября 2010

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

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

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

Итак, я вернул перманенты и изменил группу.Конечно, замените newApacheUser на учетную запись пользователя, на котором вы запускаете httpd, если НЕ apache.

# chmod 0770 session
# chown root:newApacheUser session

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

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

1 голос
/ 26 октября 2010

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

...