Есть скрипт который импортирует товары из 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.
Скорее всего забивается кеш библиотеки mysqli - почистить mysqli_free_result(), если не поможет, то раз в 10 итераций можно запускать принудительную сборку мусора gc_collect_cycles().
Разве Webasyst не делает это автоматически?
В деструкторе класса waDbResultIterator есть вызов метода "free", который в свою очередь вызывает метод free у текущего адаптера (в данном случае waDbMysqliAdapter) который собственно и освобождает ресурс.
К тому же, если бы это было так , то почему в стандартных котроллерах импорта такое поведение не наблюдается? И почему прирост проявляется именно при наличии в скрипте метода shopProduct::save()
P.S. gc_collect_cycles включен, не помогает.
Есть еще идеи насчёт этого?
Он вызывается при уничтожении объекта - не уверен что он уничтожается. что мешает посмотреть какие объекты висят в памяти?