PHP7 + Symfony 2.8, не удалось записать данные сеанса

Я скомпилировал php7 самостоятельно (974f6c2a705). если я запускаю php7 + php-fpm + nginx с помощью symfony, я получаю эту ошибку:

(используя пакет snc redis для сеансов :)

 Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp)

(используя встроенную поддержку сеанса :)

 Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/[...]/app/cache/dev/sessions)

проблема, кажется, связана с symfony, потому что php имеет доступ для чтения/записи к папке.

если я запускаю только этот код, он работает:

session_start();
$_SESSION['x'] = 4234;
session_write_close();

какие-нибудь предложения или идеи, почему symfony не может записать сеансы?


person timg    schedule 06.12.2015    source источник
comment
Это одно и то же session.save_path для PHP7 и PHP5?   -  person Andrea    schedule 07.12.2015
comment
ха-ха... У меня аналогичная ошибка для PHP7. Я использую собственный обработчик сеанса, но также получаю эту ошибку session_write_close(): Обратный вызов сеанса ожидает истинное/ложное возвращаемое значение   -  person Clay    schedule 07.12.2015
comment
В моем случае мне нужно было вернуть true/false в моем собственном обработчике сохранения сеанса вместо возврата; (нет ничего удивительного в этом....)   -  person Clay    schedule 07.12.2015
comment
ааа... теперь у меня точно такая же ошибка, как и у вас. Это прерывисто. Попытался изменить php.ini для хранения сеансов в Redis вместо файлов (session.save_handler= redis; session.save_path= tcp//blablah .. все та же ошибка.   -  person Clay    schedule 07.12.2015
comment
Метод write() моего пользовательского обработчика сеанса иногда возвращает false, что вызывает ошибку. В моем случае... это похоже на ошибку в пользовательском методе записи Zend_Session_SaveHandler_DbTable.   -  person Clay    schedule 07.12.2015


Ответы (4)


PHP7 более строг с обработкой сеанса для пользовательских обработчиков сеансов. Пользовательский обработчик сеанса Symfony для его метода записи по какой-то причине возвращает false. Раньше это не вызывало ошибки, но теперь это происходит.

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

Вот различные обработчики сеансов Symfony, большинство из них явно возвращают true, за исключением Memcache и WriteCheckSessionHandler:

https://github.com/symfony/symfony/tree/582f4753a343f230fbe18b4e9a0747d48351ddfb/src/Symfony/Component/HttpFoundation/Session/Storage/Handler

РЕДАКТИРОВАТЬ:

Поскольку вы упомянули обработчик сеанса Snc Redis Bundle, вы уверены, что используете самую последнюю версию? Год назад он был изменен, чтобы всегда возвращать true при записи:

https://github.com/snc/SncRedisBundle/blob/master/Session/Storage/Handler/RedisSessionHandler.php

ОБНОВЛЕНИЕ

Отправил ошибку в PHP, чтобы посмотреть, сможем ли мы найти более полезное сообщение об ошибке для будущих версий (пожалуйста, проголосуйте или оставьте комментарий к отчету об ошибке):

https://bugs.php.net/bug.php?id=71070

person Clay    schedule 07.12.2015
comment
я перешел на dev-master (Snc Redis Bundle), и он работает. Благодарю. - person timg; 07.12.2015
comment
Мне также пришлось вернуть true для методов destroy и gc. - person kodvin; 25.05.2016

Если вы нашли эту ветку из-за сообщения об ошибке, появляющегося вверху списка в некоторых результатах поиска, и вы не используете Symphony, что произошло в моем случае. Убедитесь, что метод записи вашего обработчика сеанса возвращает bool - true on success.

В документации php session_set_save_handler это не упоминается. Однако это упоминается в документации SessionHandlerInterface:

Возвращаемое значение (обычно TRUE в случае успеха, FALSE в случае неудачи). Обратите внимание, что это значение возвращается внутри PHP для обработки.

В более ранних версиях PHP отсутствие возврата не приводило к ошибке. Начиная с PHP 7.0, отсутствие возврата приводит к ошибке: Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp).

Похоже, что будущие версии PHP будут выдавать более четкое сообщение. Failed to write session data using user defined save handler.

Если вы используете Symphony, то ответ Криса Бэнкса дает более полное и полезное решение исходной проблемы.

person Steve E.    schedule 29.03.2016

Рад видеть, что ваша проблема решена - просто хотел добавить еще одно примечание для ясности, если кто-то, получающий эти ошибки, наткнется на эту тему: ошибки, очевидно, начались с проблемы в драйвере фреймворка и / или его конфигурации, и поэтому обновление до последней версии отделение решило проблему. Само сообщение об ошибке появилось из-за того, что PHP пытался использовать драйвер сеанса Symfony Redis и из-за проблем с конфигурацией вернулся к sess.save_path в php.ini. По этой причине PHP не мог записать в каталог — он пытался использовать пользовательский save_handler (Redis) с php.ini sess.save_path (файлы). Если он собирается вернуться к значениям по умолчанию, он также должен использовать параметр sess.save_handler в php.ini. В любом случае, сама ошибка в этом случае не указывает на реальную проблему.

person DrBlueSpruce    schedule 07.12.2015

У меня была такая же проблема, когда я перешел с Apache PHP7 на PHP7-FPM. Единственным исправлением для меня было перейти в каталог var моего приложения Symfony и удалить там все файлы, исправить разрешения для var, если необходимо, chmod 777. После этого перезагрузить URL-адрес моего приложения и готово. После этого Symfony заново создаст весь кеш, журналы, сеансы и т. д.

person KungFuMonkey    schedule 01.09.2017