Утекает память при множественном вызове setTVValue
При массовой замене TV у ресурсов в цикле заметил, что метод setTVValue очень активно ест память. Начинается всё с 12Мб и заканчивается – 400Мб к 115-ой итерации.
Обнуление используемых переменных в цикле и gc_collect_cycles не помогает.
Чем можно заменить setTVValue или как освободить память после каждой итерации?
Фрагмент проблемного кода:
Обнуление используемых переменных в цикле и gc_collect_cycles не помогает.
Чем можно заменить setTVValue или как освободить память после каждой итерации?
Фрагмент проблемного кода:
$flatArr = [];
foreach ($jsonInfo as $resourceId => $flats) {
$flatArr = [];
foreach ($flats as $flat) {
$flatArr[] = $flat;
}
$res = $modx->getObject('modResource',$resourceId);
$res->setTVValue('xml-flats', json_encode($flatArr, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
$res->save();
echo memory_get_peak_usage ($real_usage = true) . " bytes";
echo memory_get_usage() . " bytes";
unset($flatArr);
unset ($res);
gc_collect_cycles();
}
Комментарии: 3
А если без:
Оно, на самом деле при сохранении TV не нужно.
$res->save();
Оно, на самом деле при сохранении TV не нужно.
Увы, без изменений, но как только комментирую строчку:
$res->setTVValue('xml-flats', json_encode($flatArr, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
Потребление сразу падает и держится стабильно на уровне 9 мегабайт при 115 итерациях.
Мини-расследование вывело меня на виновника проблемы: функцию json_encode. Это из-за неё утекает память. И что с этим делать я совсем не представляю. :(
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.