Моему приложению необходимо использовать базу данных вместо файла для управления сеансом . Мое приложение основано на Zend Framework 1.12.17, php 5.6.25 и актуально на wampserver
Это мой config.ini
resources.session.use_only_cookies = true resources.session.gc_maxlifetime = 864000 resources.session.remember_me_seconds = 864000 resources.session.gc_probability = 1 resources.session.gc_divisor = 100 resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable" resources.session.saveHandler.options.name = "app_session" resources.session.saveHandler.options.primary = "id" resources.session.saveHandler.options.modifiedColumn = "modified" resources.session.saveHandler.options.dataColumn = "data" resources.session.saveHandler.options.lifetimeColumn = "lifetime"
Когда я хочу обновить php до php 7.0.10, возникло предупреждение
Предупреждение: session_write_close (): Не удалось записать данные сеанса (пользователь). Убедитесь, что текущие настройки session.save_path верны (D: \ wamp \ www \ myapp \ top \ session) в папке D: \ wamp \ www \ myapp \ top \ library \ versions \ ZendFramework-1.12.17-minimum \ библиотека \ Zend \ Session.php в строке 732
Я ищу происхождение этой проблемы. У вас есть идея?
большое спасибо
В сентябре 2016 года Zend Framework 1 достигнут EOL (конец жизни). Это означает, что он больше не будет улучшен. Кодовая база слишком старая, чтобы хорошо работать с PHP 7.
Во всяком случае, у вас есть как минимум два варианта:
В дополнение к edigus ответуется вот такая простая реализация расширенного обработчика save:
<?php require_once 'Zend/Session/SaveHandler/DbTable.php'; // NOTE: To fix an issue with Zend_Session_SaveHandler_DbTable on PHP 7 this class extends it and overrides the write // method to simply always return true. // // See: https://stackoverflow.com/a/44985594/1510754 // See: https://github.com/zendframework/zf1/issues/665 // See: https://github.com/zendframework/zf1/pull/654 class My_Session_SaveHandler_DbTable extends Zend_Session_SaveHandler_DbTable { public function write($id, $data) { parent::write($id, $data); return true; } }
Проблема написана здесь: https://github.com/zendframework/zf1/issues/665#issue-127528467
Поскольку обновление, которое возвращает 0, но не генерирует исключение, по-прежнему является успешным запросом без ошибок
Следовательно, функция write
вернет false
вместо true
, а PHP 7.0 требует true
результата.
Вы можете исправить это, изменив в Zend/Session/SaveHandler/DbTable.php
:
if ($this->update($data, $this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE))) {
Для того, чтобы:
if (is_int($this->update($data, $this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE)))) {
Или вы также можете удалить if
, превратить его в инструкцию и сохранить $return = true;
, Потому что при ошибке запрос должен вызвать исключение, поэтому любое update()
без исключения является хорошим.