CURL, многопоточное чтение

05.03.2018

Пример того, как curl может работать в многопоточном режиме.

Такое может потребоваться, например для парсинга множества страниц.

 
$mh = curl_multi_init();
$ch = curl_init();
$ch1 = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.google.ru");
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh,$ch);
curl_setopt($ch1, CURLOPT_URL, "http://oddler.ru");
curl_setopt ($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch1, CURLOPT_TIMEOUT, 10);
curl_setopt ($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh,$ch1);
$running=null;
//просто запускаем все соединени
while( ($mrc = curl_multi_exec($mh, $running))==CURLM_CALL_MULTI_PERFORM ); 
while($running && $mrc == CURLM_OK){
   if($running and curl_multi_select($mh)!=-1 ){
    do{
      $mrc = curl_multi_exec($mh, $running);
      // если поток завершился
      if( $info=curl_multi_info_read($mh) and $info['msg'] == CURLMSG_DONE ){
        $ch = $info['handle'];
        // смотрим http код который он вернул
        $status=curl_getinfo($ch,CURLINFO_HTTP_CODE);
        // и собственно что он вернул
        $data=curl_multi_getcontent($info['handle']);
        curl_multi_remove_handle($mh, $ch);
        curl_close($ch);
      }
    }while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
  usleep(100);
}


Пометки: curl, парсер, многопоточность.
Яндекс.Метрика