DOMDocument / Xpath утечка памяти во время длительного процесса командной строки - любой способ деконструировать этот класс

Я создаю 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, потеря памяти та же.

5
задан hakre 6 August 2013 в 21:30
поделиться