Несколько раз встречал на форуме вопросы про Warning: var_export does not handle circular references ... Но странное дело, что пользователь, которому было что-то нужно, поняв, что придется приложить какие-то усилия, исчезал из темы.
Скажу сразу: Я не открыл тайну var_export(), но предложу некий обходной манёвр.
Сейчас при кешировании на файлах работают функции var_export(), чтобы представить нужный массив в виде кода PHP, этот код пишется в файл. Затем, когда этот код нужно загрузить(взять из кеша), применяется include().
Пара слов о циклических ссылках. Это когда какой-то элемент массива ссылается на сам массив(определение не исчерпывающее). И сразу пример
<?php $data = [ 'ttl' => 300, 'value' => null ]; echo $s; $data["value"] = &$data; // элемент массива ссылается на сам массив echo $s; // $data['value'] => null
var_export() не единственный способ «упаковать» в строку значение переменной, есть ещё serialize(). Посмотрим, как ведет себя serialize() при наличии циклических ссылок
<?php $data = [ 'ttl' => 300, 'value' => null ]; echo $s."\n"; $data["value"] = &$data;// элемент массива ссылается на сам массив echo $s."\n"; // в 'value' - сам массив
Проблем с циклическими ссылками нет.
Вдохновлённый этими несложными опытами, я переписал несколько строк из /system/core/cachefiles.php, включил Кеширование в админке и оно у меня работает. Моя маленькая хитрость заключается в том, что я совершенно не изменил логики, заложенной разработчиком. Я лишь изменил формат, которым данные записываются в файл, но этот формат «не боится» циклических ссылок.
Теперь краткая инструкция для тех, кто столкнулся с Warning: var_export does not handle circular references или просто хочет попробовать.
— Отключите кеширование в админке, это очистит /cache/data/
— Замените /system/core/cachefiles.php этим файлом
— Включите кеширование в админке
Надеюсь, что это будет работать!
---
UPD 11.04.2021: Случайно наткнулся на этот коммит.
UPD 12.04.2021: После выхода сегодня InstantCMS 2.14.2 статья теряет свою актуальность, потому как в новости о релизе сказано
Кэш на файлах теперь посредством serialize/unserialize;
Реклама #
Dark Space 3 года назад #
IamB 2 года назад #
Нечаянно наткнулся на Warning: var_export does not handle circular references. Получить это предупреждение можно если выполнить var_export($fields)
в /templates/modern/controllers/users/profile_view.tpl.php