2013-09-01 4 views
3

Я использую FOSUserBundle для регистрации пользователя. И при подтверждении пользователя с помощью/register/confirm/xxxx-token-xxxxx я иногда получаю сообщение об ошибке «Не удалось запустить сеанс: уже запущен PHP ($ _SESSION установлен)».Сессия уже началась в FOS User Bundle Registration Confirmation

Это происходит в методе NativeSessionStorage :: start(). Очевидно, что уже есть сеанс ($ _SESSION - пустой массив в этом случае).

Такое поведение очень сложно воспроизвести. Он работает большую часть времени. Я вижу это в среде разработчика и prod (оба php 5.3.x)

Любая идея, почему $ _SESSION является пустым массивом при инициализации сеанса?

+0

Где-то вдоль линии сеанс предполагается закрыть, а это не так? Вы всегда можете добавить проверку: 'if (! Isset ($ _SESSION)) {session_start(); } '. – Jason

+0

Какая версия Symfony? – mkjasinski

+0

А какая версия php? Детальный номер версии! И сделайте 'grep -nP session_start src /' –

ответ

0

Я решил аннулировать сеанс перед перенаправлением.

В RegistrationController (что я скопировал в моей пачке и модифицированный), метод confirmAction, я изменил:

if (null === $response = $event->getResponse()) { 
     $url = $this->container->get('router')->generate('fos_user_registration_confirmed'); 
     $response = new RedirectResponse($url); 
    } 

к:

if (null === $response = $event->getResponse()) { 
     $session = $request->getSession(); 
     $session->invalidate(); 
     $url = $this->container->get('router')->generate('fos_user_registration_confirmed'); 
     $response = new RedirectResponse($url); 
    } 

, что сделало работу для меня.

Symfony рекомендует не использовать стандартные методы сеанса PHP, такие как session_start() и session_destroy().

Смежные вопросы