Я забираю данные о некоторых продуктах из какого-то интернет-магазина.
Когда я использую curl_multi для каждого URL-адреса продуктов, он получает parzial hmlt body. (для некоторых URL ... не для всех)
Примерно 10% из 15k URL получают половину данных
Я пытался установить неограниченную память для моего apache xampp, но проблема не устранена (начинают получать не полностью данные после 7k URL-адресов, так как перед обновлением памяти они теряли данные после 3k-URL)
url: PHP curl_multi_getcontent получено частичное тело
но я не понял ответа.
ожидаемый контент должен быть всем <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);*/