[英]PHP cUrl loop leaking memory
以下代碼處於循環中。 每個循環將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 Mb。 腳本執行時間~2h。 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.