我正在从一些在线商店中删除一些产品数据。 当我每次打开产品的所有网址使用curl_multi时,它就会收到parzial hmlt body。 (某些网址...并非全部) 大约15,000个网址中有10%会收到一半的数据
我试图为我的apache xampp设置无限内存,但问题仍然存在(由于7k url之后开始接收到不完全的数据,因为在内存升级之前3k url之后它丢失了数据)
url:PHP curl_multi_getcontent partial body received
但是我不明白答案。
预期内容必须全部为<html>
... </html>
内容,而不是一半。
是否有一些参数告诉curl_multi完成从url获取所有内容的操作,因为这样无法工作?
function multiRequest($urlArray)
{
$multi = curl_multi_init();
$handles = [];
$html = [];
foreach ($urlArray as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multi, $ch);
$handles[$url] = $ch;
}
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
// var_dump(CURLM_OK);
/** Check for results and execute until everything is done */
if (curl_multi_select($multi) == -1) {
/** If returns -1, wait a bit, but go forward always */
usleep(1000);
}
do {
$mrc = curl_multi_exec($multi, $active);
// var_dump($active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
foreach ($handles as $id => $chanel) {
$html[$id] = curl_multi_getcontent($chanel);
curl_multi_remove_handle($multi, $chanel);
curl_close($chanel);
}
curl_multi_close($multi);
return $html;
}
ini_set('memory_limit', '-1');
// $productsUrl can contain 3k urls
$productsContent = multiRequest($productsUrl);
// if divide productsUrl to chunks it works... but what point is to use culr_multi
/*$productsUrl = array_chunk($productsUrl, 25);*/