2016-03-14 4 views
1

У меня неприятная проблема с сеансом Symfony2. У меня есть тележка, в которую я могу вставить вещи. Я добавляю несколько элементов, и это работает, но на некоторых элементах приложение аварийно сообщает мне ContextErrorException: Warning: session_start(): Failed to decode session object. Session has been destroyed in ... Сессия уничтожена, и я вышел из системы.
У меня есть сессия, хранящаяся в БД, и строка о сеансе также удаляется, как чистый выход. Я triple проверил весь код, и у меня нет моего кода, который делает недействительным сеанс. Я также прокомментировал каждую строку, содержащую session->invalidate, безрезультатно.
Я заметил, что очистка сеанса происходит между «возвратом» одной функции и следующей строкой в ​​моем коде после возврата кода, но между ними нет кода. Кажется, что-то связано с событиями/слушателями, но никто не настроен мной.
Я не знаю, где проверить, какие идеи?Сбой Symfony 2

ответ

1

Основываясь на this report и других поисковых запросах, я полагаю, вы храните многобайтные строки в своих данных сеанса, и он становится поврежденным. Также возможно, что столбец базы данных, хранящий данные, слишком короткий, и строка становится усеченной, развращая ее. Вот то, на что я бы посмотрел:

  • Если вы используете базу данных для хранения данных, убедитесь, что она подготовлена ​​для многобайтовых строк.
  • Убедитесь, что столбец базы данных сеансов достаточно велик, например. MEDIUMTEXT вместо VARCHAR.
  • Возможно, в обработчике сеансов Symfony есть ошибка (маловероятно, так как это, вероятно, было бы быстро схвачено).
  • Возможно, вы каким-то образом испортили свои собственные многобайтные строки. Убедитесь, что вы не используете какие-либо функции PHP, которые не являются бинарными.

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

+0

Я использую pdo для хранения сеанса, а первая инструкция в методе Save в классе symfony - '' bas64_encode'''. Странно, что только некоторая комбинация объектов в корзине создает сообщение об ошибке. –

+1

Чтобы быть точным: в сеансе хранятся сериализованные объекты приложения, когда все работает с корреляцией, я могу base64 декодировать содержимое сеанса в БД и видеть все сериализованные объекты. На самом деле, если я вручную испортил данные в БД, я получаю ту же ошибку. –

+0

Интересно. Вы, конечно, тщательно изучали его. Вы пытались вручную десериализовать эти объекты? Может быть, строка безопасна, но unserialize терпит неудачу. Кроме того, слишком длинный сериализованный объект для размера столбца db? –

0

Я изменил метод чтения e read PDOSessionHandler вместо base64encode/decode. Я поместил utf8_encode для записи и в метод чтения я поместил utf8_decode. Это обходное решение работает для меня, но не является чистым решением. Вопрос в следующем: почему base64encode/decode не удается?