serialize() вместо var_export() 2.X

410
Несколько раз встречал на форуме вопросы про Warning: var_export does not handle circular references ... Но странное дело, что пользователь, которому было что-то нужно, поняв, что придется приложить какие-то усилия, исчезал из темы.
Скажу сразу: Я не открыл тайну var_export(), но предложу некий обходной манёвр.

Сейчас при кешировании на файлах работают функции var_export(), чтобы представить нужный массив в виде кода PHP, этот код пишется в файл. Затем, когда этот код нужно загрузить(взять из кеша), применяется include().
Пара слов о циклических ссылках. Это когда какой-то элемент массива ссылается на сам массив(определение не исчерпывающее). И сразу пример
var_export()
var_export() не единственный способ "упаковать" в строку значение переменной, есть ещё serialize(). Посмотрим, как ведет себя serialize() при наличии циклических ссылок
serialize()
Проблем с циклическими ссылками нет.
Вдохновлённый этими несложными опытами, я переписал несколько строк из /system/core/cachefiles.php, включил Кеширование в админке и оно у меня работает. Моя маленькая хитрость заключается в том, что я совершенно не изменил логики, заложенной разработчиком. Я лишь изменил формат, которым данные записываются в файл, но этот формат "не боится" циклических ссылок.

Теперь краткая инструкция для тех, кто столкнулся с Warning: var_export does not handle circular references или просто хочет попробовать.
- Отключите кеширование в админке, это очистит /cache/data/
- Замените /system/core/cachefiles.php этим файлом
- Включите кеширование в админке
Надеюсь, что это будет работать!
---
UPD 11.04.2021 : Случайно наткнулся на этот коммит. laugh
UPD 12.04.2021 : После выхода сегодня InstantCMS 2.14.2 статья теряет свою актуальность, потому как в новости о релизе сказано
Кэш на файлах теперь посредством serialize/unserialize;
Оптимизация размера изображений на сайте
Комментарии (1)
Inna 14 марта 2021 в 05:42 +1
Блоги пишет и на форуме людям помогает +