Утечка памяти (longAction + shopProduct)

Mr. X

Есть скрипт который импортирует товары из XML файла используя механизм waLongActionController.
В целом скрипт работает нормально и выполняет свою работу, но есть проблема с непонятным приростом памяти выделенной скрипту;
В конце метода "step" логируется значение memory_get_peak_usage(true);
С каждым вызовом метода "step" значение увеличивается, и доходит до 12-15mb (что довольно жестко для одного скрипта).

Заметил что если перед строчкой сохранения товара:
$shop_product->save(); // $shop_product это экземпляр класса shopProduct.

Поставить: return true;

То расход памяти нормализуется (get_peak_usage(true) = 4mb макс.), то есть прироста не наблюдается.
Если же установить "return true" ниже вызова метода "save" то, как и писал выше, в процессе работы расход памяти увеличивается с каждым новым процессом.

Такое поведение очень странное, учитывая что все стандартные импорты используют shopProduct для редактирования/добавления товаров, и там нет таких проблем.

Очень интересно с чем это может быть связано, сталкивался ли кто-то с такой проблемой?
Хотелось бы узнать мнение у разработчиков Webasyst.

22 ноября 2017
  • info@ravencode.ru 22 ноября 2017 12:18

    Скорее всего забивается кеш библиотеки mysqli - почистить mysqli_free_result(), если не поможет, то раз в 10 итераций можно запускать принудительную сборку мусора gc_collect_cycles().

  • Mr. X 22 ноября 2017 14:29

    Разве Webasyst не делает это автоматически?

    В деструкторе класса waDbResultIterator есть вызов метода "free", который в свою очередь вызывает метод free у текущего адаптера (в данном случае waDbMysqliAdapter) который собственно и освобождает ресурс.

    К тому же, если бы это было так , то почему в стандартных котроллерах импорта такое поведение не наблюдается? И почему прирост проявляется именно при наличии в скрипте метода shopProduct::save()

    P.S. gc_collect_cycles включен, не помогает.

    Есть еще идеи насчёт этого?

  • info@ravencode.ru 22 ноября 2017 19:30

    Он вызывается при уничтожении объекта - не уверен что он уничтожается. что мешает посмотреть какие объекты висят в памяти?



Чтобы добавить комментарий, зарегистрируйтесь или войдите