Я создаю приложение для очистки 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
, потеря памяти такая же.
unset
? Кроме того, если вы просто очищаете и не модифицируете рассматриваемые DOM, я бы вместо этого использовал SimpleXML. Это немного легче, а также поддерживает xpath. - person prodigitalson   schedule 19.11.2011$this->dom
? Вам нужно добавить DOMDocument к члену класса? - person hakre   schedule 19.11.2011