Проблема с поведениями при восстановлении модели из кэша

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Проблема с поведениями при восстановлении модели из кэша

Сообщение Svyatov »

Есть код, который кладет массив моделей в кэш, например так:

Код: Выделить всё

Yii::app()->cache->set($id, $value); 
При этом у моделей есть поведения, допустим самое стандартное:

Код: Выделить всё

public function behaviors()
    {
        return array(
            'CTimestampBehavior' => array(
                'class' => 'zii.behaviors.CTimestampBehavior',
                'createAttribute' => 'entity_created_date',
            ),
        );
    } 
Теперь бага: если в конфиге мы не прописываем импорт этого поведения явно:

Код: Выделить всё

'zii.behaviors.*', 
То при извлечении модели из кэша мы получаем ошибку:

Код: Выделить всё

[php] include(CTimestampBehavior.php): failed to open stream: No such file or directory
Хотя в модели путь до поведения прописан целиком.

Это баг/фича или я что-то делаю не так?
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: Проблема с поведениями при восстановлении модели из кэша

Сообщение SpiLLeR »

Присоединяюсь к вопросу, т.к. такое происходит не только с кэшированием...
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Проблема с поведениями при восстановлении модели из кэша

Сообщение samdark »

Это стандартная PHP-шная десериализация.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Проблема с поведениями при восстановлении модели из кэша

Сообщение samdark »

By default, when unserializing PHP will not call the autoloader when it discovers an unknown class. This can be fixed easily with the following directive in php.ini

unserialize_callback_func = 'spl_autoload_call'
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Проблема с поведениями при восстановлении модели из кэша

Сообщение Svyatov »

Sam Dark писал(а):By default, when unserializing PHP will not call the autoloader when it discovers an unknown class. This can be fixed easily with the following directive in php.ini

unserialize_callback_func = 'spl_autoload_call'
Век живи, век учись... спасибо!
Аватара пользователя
coder
Сообщения: 139
Зарегистрирован: 2010.04.09, 23:42
Откуда: Москва

Re: Проблема с поведениями при восстановлении модели из кэша

Сообщение coder »

Изменил директиву, а ошибка всё равно осталась. Мистика. В методе put, shopping карт.
Аватара пользователя
Bethrezen
Сообщения: 42
Зарегистрирован: 2011.04.17, 15:06
Откуда: Tambov
Контактная информация:

Re: Проблема с поведениями при восстановлении модели из кэша

Сообщение Bethrezen »

Из этой ситуации я вижу два выхода и оба касаются расширения функционала сериализации:

1. Перед сериализацией проверяем на объект - если да, то аппендим в какой-нибудь import.php нужный Yii::import. Этот import подключаем при старте приложения.
Плюсы:
- железный метод
- не озадачиваем кеши накладными расходами
- работает даже тогда, когда Yii::import ещё не вызывался
Минус:
- при старте приложения делаются лишние Yii::import

2. Сериализуется не только объект, но и его тип и путь в отдельное место. Перед десериализацией обращаемся к этому месту, делаем Yii::import и потом десериализуем нужный объект.
Плюс:
- не будет лишних Yii::import
Минус:
- накладные расходы

Я всё-таки склоняюсь ко второму варианту.
DotPlant 2 - Open-source yii2 e-commerce CMS :: GitHub | Official site | Made by DevGroup
Ответить