Есть функция, которая, используя библиотеку phpQuery, парсит данные со страницы на сайте. Данные на странице обновляются регулярно, поэтому функция вызывается в цикле приблизительно каждые 5-10 секунд (в зависимости от скорости получения страницы). После продолжительной работы скрипта (приблизительно 8-10 часов, при этом ~3-5 часов из этого времени ноутбук я не трогал), получаю ошибку (забыл ее скопировать с логов), что не хватает памяти для работы phpQuery. В php.ini memory_limit = 1536M. Скрипт работает на локальном сервере (OpenServer). В диспетчере задач объем памяти потребляемый Apache HTTP Server постоянно колеблется, к примеру: несколько минут назад (после небольшого простоя бездействия ноутбука было 170Мб), сейчас (спустя минут 10) - 60 Мб. Собственно сама функция. Не могу понять в чем проблема и почему phpQuery::unloadDocuments(); как-то избирательно очищает документы
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- function parcer($url){
- $ids=[];
- $indexIds=0;
- $content = get_content($url);
- $doc = phpQuery::newDocument($content);
- foreach ($doc->find('[id^=name_]:input') as $opt) { // получаем товары которые успели преобразоваться в input
- $opt=pq($opt);
- $ids[$indexIds][] = $numTov;
- $ids[$indexIds][] = $opt->attr('value'); // получаем значение input
- $ids[$indexIds][] = $opt->nextAll('input:first-of-type')->prev('a')->text(); //ищем последнюю ссылку каталога
- $ids[$indexIds][] = $opt->nextAll('nobr')->children('[id^=manf]')->text(); //ищем поставщика
- $indexIds++;
- }
- foreach ($doc->find('td>[id^=name_]:not(:input)') as $opt) { // получаем товары в span, которые без родителя
- $opt=pq($opt);
- $ids[$indexIds][] = $numTov;
- $ids[$indexIds][]= $opt->text();
- $ids[$indexIds][] = $opt->nextAll('[id^=cats_]:last')->text();
- $ids[$indexIds][] = $opt->nextAll('nobr')->children('[id^=manf]')->text();
- $indexIds++;
- }
- foreach ($doc->find('div>[id^=name_]') as $opt) { // получаем товары в span, которые с родителем
- $opt=pq($opt);
- $ids[$indexIds][] = $numTov;
- $ids[$indexIds][]= $opt->text();
- $ids[$indexIds][] = $opt->parent()->nextAll('[id^=cats_]:last')->text();
- $ids[$indexIds][] = $opt->parent()->nextAll('nobr')->children('[id^=manf]')->text();
- $indexIds++;
- }
- phpQuery::unloadDocuments(); //очистка документа
- gc_collect_cycles(); // принудительный вызов встроенного сборщика мусора PHP
- return $ids;
- }