Утекает память при множественном вызове setTVValue

При массовой замене TV у ресурсов в цикле заметил, что метод setTVValue очень активно ест память. Начинается всё с 12Мб и заканчивается – 400Мб к 115-ой итерации.
Обнуление используемых переменных в цикле и 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();
}
Роман Ильин
18 октября 2017, 15:37
modx.pro
931
0

Комментарии: 3

Павел Романов
18 октября 2017, 20:09
+1
А если без:
$res->save();

Оно, на самом деле при сохранении TV не нужно.
    Роман Ильин
    18 октября 2017, 20:27
    0
    Увы, без изменений, но как только комментирую строчку:

    $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 итерациях.
      Роман Ильин
      18 октября 2017, 22:30
      0
      Мини-расследование вывело меня на виновника проблемы: функцию json_encode. Это из-за неё утекает память. И что с этим делать я совсем не представляю. :(
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3