У меня неприятная проблема с сеансом Symfony2. У меня есть тележка, в которую я могу вставить вещи. Я добавляю несколько элементов, и это работает, но на некоторых элементах приложение аварийно сообщает мне ContextErrorException: Warning: session_start(): Failed to decode session object. Session has been destroyed in ...
Сессия уничтожена, и я вышел из системы.
У меня есть сессия, хранящаяся в БД, и строка о сеансе также удаляется, как чистый выход. Я triple проверил весь код, и у меня нет моего кода, который делает недействительным сеанс. Я также прокомментировал каждую строку, содержащую session->invalidate
, безрезультатно.
Я заметил, что очистка сеанса происходит между «возвратом» одной функции и следующей строкой в моем коде после возврата кода, но между ними нет кода. Кажется, что-то связано с событиями/слушателями, но никто не настроен мной.
Я не знаю, где проверить, какие идеи?Сбой Symfony 2
ответ
Основываясь на this report и других поисковых запросах, я полагаю, вы храните многобайтные строки в своих данных сеанса, и он становится поврежденным. Также возможно, что столбец базы данных, хранящий данные, слишком короткий, и строка становится усеченной, развращая ее. Вот то, на что я бы посмотрел:
- Если вы используете базу данных для хранения данных, убедитесь, что она подготовлена для многобайтовых строк.
- Убедитесь, что столбец базы данных сеансов достаточно велик, например.
MEDIUMTEXT
вместоVARCHAR
. - Возможно, в обработчике сеансов Symfony есть ошибка (маловероятно, так как это, вероятно, было бы быстро схвачено).
- Возможно, вы каким-то образом испортили свои собственные многобайтные строки. Убедитесь, что вы не используете какие-либо функции PHP, которые не являются бинарными.
Если вы не можете найти основную причину, я бы попытался переопределить обработчик хранилища сеансов и запустить base64_encode
по данным перед хранением и декодировать после извлечения. Но это последнее средство для решения реальной проблемы.
Я изменил метод чтения e read PDOSessionHandler вместо base64encode/decode. Я поместил utf8_encode для записи и в метод чтения я поместил utf8_decode. Это обходное решение работает для меня, но не является чистым решением. Вопрос в следующем: почему base64encode/decode не удается?
- 1. Symfony 2: переопределить компонент symfony
- 2. Symfony OAuth апи FOSOAuthServerBundle: сбой
- 3. Symfony 2 + Doctrine 2 + inheritance
- 4. Symfony 2 Symfony \ Component \ HttpFoundation HeaderBag заголовки
- 5. Symfony 2 - Symfony CMF SearchBundle instalation
- 6. Symfony 2 custom filter
- 7. Symfony 2 ServiceNotFoundException
- 8. Symfony 2 using Postgresql
- 9. Symfony 2 - несколько форм
- 10. Symfony 2 Форма подтверждения
- 11. Symfony 2 Пользовательский поставщик
- 12. Symfony 2 + dompdf
- 13. Symfony 2 GeniusesOfSymfony/WebSocketBundle
- 14. Symfony 2 Data_collector.time
- 15. Symfony 2 сохранить данные
- 16. Symfony 2 и проекты
- 17. Symfony 2: исключение Swiftmailer
- 18. Symfony 2 php.ini date.timezone
- 19. Symfony 2 Acls insertClassAces
- 20. Symfony 2 глобальные функции
- 21. Symfony 2 + SoapClient
- 22. Symfony 2 Code Encryption
- 23. Entity менеджер Symfony 2
- 24. Symfony 2 валидации сообщение
- 25. Symfony 2: класс детей
- 26. Проверка Symfony 2
- 27. CSS в Symfony 2
- 28. Symfony 2 Routing
- 29. Symfony 2: передовая практика
- 30. Symfony 2 заблокировал параллелизм
Я использую pdo для хранения сеанса, а первая инструкция в методе Save в классе symfony - '' bas64_encode'''. Странно, что только некоторая комбинация объектов в корзине создает сообщение об ошибке. –
Чтобы быть точным: в сеансе хранятся сериализованные объекты приложения, когда все работает с корреляцией, я могу base64 декодировать содержимое сеанса в БД и видеть все сериализованные объекты. На самом деле, если я вручную испортил данные в БД, я получаю ту же ошибку. –
Интересно. Вы, конечно, тщательно изучали его. Вы пытались вручную десериализовать эти объекты? Может быть, строка безопасна, но unserialize терпит неудачу. Кроме того, слишком длинный сериализованный объект для размера столбца db? –