Следующий код находится в цикле. Каждый цикл меняет 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.
Как избежать утечки памяти? Спасибо!
Истории из Интернета показывают, что curl_setopt($ch, CURLOPT_RETURNTRANSFER, true)
взломан для некоторых версий PHP / cURL:
Вы также можете найти истории для DOM
:
Создайте минимальный контрольный пример, который определит причину утечки. То есть удалите несвязанный пакет (DOM или cURL) из кода.
Затем воспроизведите его с последней версией PHP. Если это все еще вызывает утечку, подать отчет об ошибке еще использовать эту версию PHP.
Повторно используйте одну и ту же ручку скручивания вместо того, чтобы создавать и уничтожать ее каждый раз в цикле.
$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);