Потеря памяти в цикле PHP cUrl

Следующий код находится в цикле. Каждый цикл меняет URL на новый адрес. Моя проблема в том, что каждый проход занимает все больше и больше памяти.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://site.ru/');
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, 'http://site.ru/');
curl_setopt($ch, CURLOPT_HEADER, false);

$html = new \DOMDocument();
$html->loadHTML(curl_exec($ch));

curl_close($ch);
$ch = null;

$xpath = new \DOMXPath($html);
$html = null;

foreach ($xpath->query('//*[@id="tree"]/li[position() > 5]') as $category) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $xpath->query('./a', $category)->item(0)->nodeValue);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, 'http://site.ru/');
curl_setopt($ch, CURLOPT_HEADER, false);

$html = new \DOMDocument();
$html->loadHTML(curl_exec($ch));

curl_close($ch);
$ch = null;

// etc.
}

Память 2000 Мб. Время выполнения скрипта ~ 2 часа. Версия PHP 5.4.4.
Как избежать утечки памяти? Спасибо!

3

Решение

Истории из Интернета показывают, что curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) взломан для некоторых версий PHP / cURL:

Вы также можете найти истории для DOM:

Создайте минимальный контрольный пример, который определит причину утечки. То есть удалите несвязанный пакет (DOM или cURL) из кода.

Затем воспроизведите его с последней версией PHP. Если это все еще вызывает утечку, подать отчет об ошибке еще использовать эту версию PHP.

3

Другие решения

Повторно используйте одну и ту же ручку скручивания вместо того, чтобы создавать и уничтожать ее каждый раз в цикле.

$ch = curl_init();
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, 'http://site.ru/');
curl_setopt($ch, CURLOPT_HEADER, false);
foreach ($pages as $url) {
curl_setopt($ch, CURLOPT_URL, $url);
$response = curl_exec($ch);
}
curl_close($ch);
2

По вопросам рекламы [email protected]