В @Phliplip и @lunixbochs упоминаются общие ловушки cURL (максимальное время выполнения и отклонено целевым сервером).
При отправке такого количества запросов cURL на один и тот же сервер я стараюсь "быть хорошим" идобровольно спите, чтобы я не бомбардировал хозяина.Для сайта низкого уровня 1000+ запросов могут быть похожи на мини DDOS!
Вот код, который работал для меня.Раньше он собирал данные о клиентских продуктах со своего старого сайта, поскольку данные были заблокированы в собственной системе баз данных с функцией экспорта NO .
<?php
header('Content-type: text/html; charset=utf-8', true);
set_time_limit(0);
$urls = array(
'http://www.example.com/cgi-bin/product?id=500',
'http://www.example.com/cgi-bin/product?id=501',
'http://www.example.com/cgi-bin/product?id=502',
'http://www.example.com/cgi-bin/product?id=503',
'http://www.example.com/cgi-bin/product?id=504',
);
$i = 0;
foreach($urls as $url){
echo $url."\n";
$curl = curl_init($url);
$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';
curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($curl, CURLOPT_TIMEOUT, 25 );
$html = curl_exec($curl);
$html = @mb_convert_encoding($html, 'HTML-ENTITIES', 'utf-8');
curl_close($curl);
// now do something with info returned by curl
$i++;
if($i%10==0){
sleep(20);
} else {
sleep(2);
}
}
?>
Основные характеристики:
- нет максимального времени выполнения
- добровольный сон
- новый init & exec curl для каждогоrequest.
По моему опыту, переход в спящий режим () не позволит серверам отказывать вам.Однако если под « другой сервер различен » вы имеете в виду, что вы отправляете небольшое количество запросов большому количеству серверов, например:
$urls = array(
'http://www.example-one.com/',
'http://www.example-two.com/',
'http://www.example-three.com/',
'http://www.example-four.com/',
'http://www.example-five.com/',
'http://www.example-six.com/'
);
И вы используете set_time_limit(0);
тогда что-то, тогда ошибка может быть причиной вашего кода die;
попробовать
ini_set('display_errors',1);
error_reporting(E_ALL);
и сообщить нам сообщение об ошибке, которое вы получаете.