2014-09-26 3 views
0

Я нашел способ получить код ответа HTTP с URL-адреса, используя get_headers($url). Эта функция возвращает массив, как в следующем ...PHP Получить код ответа HTTP

Array 
(
    [0] => HTTP/1.1 200 OK 
    [1] => Date: Sat, 29 May 2004 12:28:13 GMT 
    [2] => Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) 
    [3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT 
    [4] => ETag: "3f80f-1b6-3e1cb03b" 
    [5] => Accept-Ranges: bytes 
    [6] => Content-Length: 438 
    [7] => Connection: close 
    [8] => Content-Type: text/html 
) 

Моя проблема заключается в том, что у меня может быть большой список URL-адресов, которые я хочу цикла, хотя и получить код ответа HTTP для каждого URL. Кажется, это неприятный и медленный способ использовать эту функцию внутри цикла для потенциально 100-х URL-адресов.

Как ускорить этот процесс и сделать его более чистым или это лучший способ сделать это? Я хотел бы знать ваши предложения.

Благодаря

+0

Вы просто хотите получить коды ответа HTTP или все детали ответа? –

+3

Вы действительно профилировали его и обнаружили, что он медленный? –

+0

Только коды ответов, я знаю, что могу сделать что-то вроде 'foreach ($ urls as $ url) echo get_headers ($ url) [0]; } '. Мне интересно, есть ли что-нибудь быстрее? – itsliamoco

ответ

0

Сети звонков по своей сути требует времени, но вы можете получить до завершения быстрее, запустив эти вызовы параллельно. Один из способов сделать это - использовать curl_multi. Дайте мне минуту, и я выпишу пример.

//set up list of urls and arrays to hold responses 
$urls = array(
    'http://www.livestrong.com/', 
    'http://www.apple.com/' 
    //add more urls here 
); 

$response_map = array(); 
$responses_by_url = array(); 

//create the multi object 
$multi = curl_multi_init(); 
foreach($urls as $url) { 
    //add a request for each url 
    $ch = curl_init($url); 
    $response_map[$ch] = $url; 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    //since that's all you need, we'll save some bandwidth by just asking for the HEAD 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); 
    curl_multi_add_handle($multi, $ch); 
} 

//start the multi request 
$still_running = 0; 
curl_multi_exec($multi, $still_running); 

//loop while waiting for completion 
do { 
    curl_multi_select($multi); //blocks until state change 
    curl_multi_exec($multi, $still_running); //get new state 

    //read all available new information 
    while ($info = curl_multi_info_read($multi)) { 
     if ($info['msg'] === CURLMSG_DONE) { 
      //we're done, check the result 
      if ($info['result'] === CURLE_OK) { 
       //result ok, parse it 
       $url = $response_map[$info['handle']]; 
       $header_text = curl_multi_getcontent($info['handle']); 
       curl_multi_remove_handle($multi, $info['handle']); 
       $header_array = explode("\r\n", trim($header_text)); 
       $responses_by_url[$url] = $header_array; 
      } else { 
       //record error 
       $responses_by_url[$url] = "error: " . curl_error($ch); 
      } 
     } 
    } 
} while ($still_running); 

//clean up 
curl_multi_close($multi); 

//output results 
var_dump($responses_by_url); 
+0

cURL Multi ** ** не выполняет запросы параллельно, это делает их асинхронно. –

0

Чтобы выполнить эти 100 запросов, вам необходимо использовать curl_multi_init(). Существует небольшой php lib php-multi-curl, который может помочь вам выполнить задачу.

Смежные вопросы