Как НЕ вернуть данные из curl-multi и снизить нагрузку на процессор?
У меня есть скрипт в php, который использует multi curl.
Общий запрос многоуровневой передачи состоит из 50 отдельных ручек завитков. Для возврата каждого запроса требуется некоторое время, поэтому мой сценарий должен просто дождаться окончания обработки на удаленном сервере.
Каждый из этих 50 запросов возвращает довольно много данных (контента), которые мне не нужны. Поэтому было бы более эффективно игнорировать возвращенные данные. Однако мне нужно знать, когда обработка на удаленном сервере завершена, когда возвращаются данные.
Причина, по которой мне не нужно использовать данные, но нужно сделать запрос, заключается в том, что удаленный сервер помещает данные в базу данных, которую я впоследствии получаю с моего собственного сервера. Поэтому мне нужно только сделать этот запрос, и мне нужно знать, когда скрипт на удаленном сервере закончен.
Мой вопрос: этот запрос потребляет много ресурсов процессора, как я могу сделать его более эффективным?
Код:
$nrofrequests=count($variable1);
//Build multi-curl for all to scrape sites at once:
for($i=0;$i<$nrofrequests;$i++){
$post='variable1='.$variable1[$i].'&variable2='.$variable2[$i];
$url='http://www.domain.com/'.$scriptnumber[$i];
$ch[$i] = curl_init($url);
curl_setopt ($ch[$i], CURLOPT_POST, 1);
curl_setopt ($ch[$i], CURLOPT_POSTFIELDS, $post);
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch[$i], CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch[$i], CURLOPT_TIMEOUT, 35);
set_time_limit(35);
}
// build the multi-curl handle, adding both $ch
$mh = curl_multi_init();
for ($i=0; $i<$nrofrequests; $i ++ ):
curl_multi_add_handle($mh, $ch[$i]);
endfor;
// execute all queries simultaneously, and continue when all are complete
$running = null;
do {curl_multi_exec($mh, $running);}
while ($running);
for ($i=0; $i<$nrofrequests; $i ++ ):
curl_multi_remove_handle($mh, $ch[$i]);
endfor;
2 ответа
Если вы не установили для CURLOPT_RETURNTRANSFER значение true, а для CURLOPT_NOBODY - значение true, в качестве результата вы получите только логическое значение, независимо от того, завершилось оно неудачно или нет. Но я сомневаюсь, что это улучшит загрузку процессора.
Однако сон в ожидании завершения завитка улучшит использование процессора.
// During init
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, false);
curl_setopt($chi[$i], CURLOPT_NOBODY,true);
// execute all queries simultaneously, and continue when all are complete
$running = null;
do {
curl_multi_select($mh,5); // Wait max 5 seconds 'till at least one of the curls shows activity
curl_multi_exec($mh, $running);
}
while ($running );
На этот вопрос уже много раз отвечали на stackru. Вы ДОЛЖНЫ использовать curl_multi_select, чтобы избежать зацикливания.