Как бороться с segmentation fault в simple_html_dom

Standard

Иногда бывает что ваш скрипт выдает ошибку segmentation fault (ошибка сегментации) и завершает свою работу. Скорей всего ошибка в комбинации ваших расширений к пхп, попробуйте оставить только те расширения, к-ые необходимы для скрипта. Если все ок — найдите расширение, к-ое глючит и попробуйте обновить либо само расширение, либо библиотеку, к-ую оно использует.

Но к сожалению у меня эта ошибка возникала на нескольких компьютерах с разными версиями php и комбинацией расширений. Причина была в библиотеке для парсинга simple_html_dom, пробовал Nokogiri, Zend_Dom — все равно, лучше simple_html_dom ничего нету. При больших объемах обрабатываемого html кода, например внутри цикла, возникает segmentation fault. Возможное решение — разместите следующий код в конце итерации (если парсинг идет в цикле):

$simple_html_object->clear();
unset($simple_html_object);

Строка выше помогает бороться с потреблением памяти, но полностью ошибку segfault не решает. Причина кроется на 143 строке (в классе simple_html_dom_node):
// clean up memory due to php5 circular references memory leak...
function clear()
{
$this->dom = null;
$this->nodes = null;
$this->parent = null;
$this->children = null;
}

Данная функция вызывается деструктором simple_html_dom_node класса, и когда подходит его очередь для garbage collector`a происходит segfault (в некоторых случаях).
Есть открытый bug на sourceforge, люди советуют сделать так:
// clean up memory due to php5 circular references memory leak...
function clear()
{
unset($this->dom);
unset($this->nodes);
unset($this->parent);
unset($this->children);
}

Но мне и это не помогло, решил сделать быстро и тупо => закомментировать все строки внутри clear функции. В итоге потребление памяти увеличилось, к примеру раньше было стабильно 20 мегабайт, теперь — при парсинге около 1000 страниц потребление где-то 1 гагабайт, зато без segfault`а :)!

Ошибки при установке http расширения для php

Standard

Прогаю парсер, для этого использую классное расширение http для php, там много полезных функции, типа

http_parse_headers();
http_parse_params();

Чтобы установить без проблем под debian, нужно:

apt-get install php5-curl php5-dev libcurl3 libcurl4-gnutls-dev
pecl install pecl_http

В процессе установки у меня была ошибка:
curl.h not found
Я уже добавил в строку установки строку «libcurl4-gnutls-dev», и у вас такого быть не должно