Solid
Drosera anglica
Multithreaded cURL complete checking
Каким образом можно узнать - скачались ли все данные со всех ссылок?
В данный момент делаю что-то вроде:
Использование:
Всё работает хорошо, и лишь изредка некоторые страницы не скачиваються, или не докачиваються.
Возможно кто-то уже сталкивался с подобной проблеммой.
Спасибо.
Каким образом можно узнать - скачались ли все данные со всех ссылок?
В данный момент делаю что-то вроде:
PHP:
function get_url($url) {
//$start = microtime(true);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 400);
$result = curl_exec($ch);
curl_close($ch);
if(empty($result)) {
$result = get_url($url);
}
//echo microtime(true)-$start;
return $result;
}
function get_url_multi($urls) {
//echo 'multi is working... ';
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT, 400);
curl_setopt($conn[$i], CURLOPT_HEADER, 0);
curl_multi_add_handle ($mh,$conn[$i]);
}
// start performing the request
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active and $mrc == CURLM_OK) {
// wait for network
if (curl_multi_select($mh) != -1) {
// pull in any new data, or at least handle timeouts
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
if ($mrc != CURLM_OK) {
print "Curl multi read error $mrc\n";
}
// retrieve data
foreach ($urls as $i => $url) {
if (($err = curl_error($conn[$i])) == '') {
$res[$i]=curl_multi_getcontent($conn[$i]);
if(empty($res[$i])) {
$res[$i] = get_url($urls[$i]);
}
} else {
if(empty($res[$i])) {
$res[$i] = get_url($urls[$i]);
}
}
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
return $res;
}
PHP:
get_url_multi(array('http://www.phpclub.ru/', 'http://phpconf.ru/', 'http://phpinside.ru'));
Возможно кто-то уже сталкивался с подобной проблеммой.
Спасибо.