Я создаю php-приложение для скраппинга в командной строке, которое использует XPath для анализа HTML - проблема в том, что каждый раз, когда новый экземпляр класса DOMXPath загружается в цикле, я получаю потерю памяти, примерно равную размеру загружаемого XML. Сценарий работает и работает, медленно наращивая использование памяти, пока не достигнет предела и не завершится.
Я пробовал принудительно собирать мусор с помощью gc_collect_cycles()
и PHP по-прежнему не возвращает память из старых запросов Xpath. Действительно, определение класса DOMXPath, похоже, даже не включает функцию деструктора?
Поэтому мой вопрос заключается в следующем... есть ли способ принудительно очистить от мусора DOMXPath
после того, как я уже извлек необходимые данные? Использование unset для экземпляра класса предсказуемо ничего не дает.
В коде нет ничего особенного, просто стандартный Xpath:
//Loaded outside of loop
$this->dom = new DOMDocument();
//Inside Loop
$this->dom->loadHTML($output);
$xpath = new DOMXPath($this->dom);
$nodes = $xpath->query("//span[@class='ckass']");
//unset($this->dom) and unset($xpath) doesn't seem to have any effect
Как вы можете видеть выше, я сохранил инстанцирование нового класса DOMDocument
вне цикла, хотя это, похоже, не улучшает производительность. Я даже попробовал вынести экземпляр класса $xpath
из цикла и загрузить DOM в Xpath напрямую, используя метод __constructor
, потеря памяти та же.