簡體   English   中英

顯示來自curl_multi_init HTTP請求的多個標頭信息

[英]Display multiple header info from curl_multi_init HTTP request

我正在嘗試從多個網頁獲取標頭信息。 我嘗試使用以下代碼使用單個cURL請求來做到這一點:

<?php
$arr = array(
        "John", "Mary",
        "William", " Peter",
        "James", "Emma",
        "George", "Elizabeth",
        "Charles", "Margaret",
    );

$ch = curl_init();    

for($i=0; $i<sizeOf($arr); $i++){
    $url = "https://example.com/".$arr[$i];
    $options = array(
    CURLOPT_URL            => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_SSL_VERIFYPEER => FALSE,
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
);

curl_setopt_array( $ch, $options );
    $response = curl_exec($ch); 
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ( $httpCode != 200 ){
        echo $arr[$i]." Error<br>";
    } else {
        echo $arr[$i]." Success<br>";
    }
}

curl_close($ch);
?>

但是這段代碼似乎需要很長的執行時間。 我在互聯網上搜索並找到了curl_multi_exec ,可以一次運行多個cURL請求。 所以現在我使用以下代碼:

  <?php
ini_set('max_execution_time', 0);

$arr = array(
    "John", "Mary",
    "William", " Peter",
    "James", "Emma",
    "George", "Elizabeth",
    "Charles", "Margaret",
);

function multiRequest($data) {

  // array of curl handles
  $curly = array();
  // data to be returned
  $result = array();

  // multi handle
  $mh = curl_multi_init();

  // loop through $data and create curl handles
  // then add them to the multi-handle
  foreach ($data as $id => $d) {

    $curly[$id] = curl_init();

    $url = "https://example.com/".$data[$id];


    $options = array(
      CURLOPT_URL            => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_SSL_VERIFYPEER => FALSE,
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
);

    // extra options?
    if (!empty($options)) {
      curl_setopt_array($curly[$id], $options);
    }

    curl_multi_add_handle($mh, $curly[$id]);
  }

  // execute the handles
  $running = null;
  do {
    curl_multi_exec($mh, $running);
  } while($running > 0);


  // get content and remove handles
  foreach($curly as $id => $c) {
    $result[$id] = curl_multi_getcontent($c);
    //Code to fetch header info
    curl_multi_remove_handle($mh, $c);
  }

  // all done
  curl_multi_close($mh);

  return $result;
}

multiRequest($arr);

?>

如何從curl_multi_init HTTP請求中獲取多個header_info?

這段代碼來自您的第一個示例:

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ( $httpCode != 200 ){
    echo $arr[$i]." Error<br>";
} else {
    echo $arr[$i]." Success<br>";
}

即使curl句柄由curl_multi_exec()執行也將起作用。


在第二個示例中,替換此代碼:

// get content and remove handles
foreach($curly as $id => $c) {
    $result[$id] = curl_multi_getcontent($c);
    //Code to fetch header info
    curl_multi_remove_handle($mh, $c);
}

有了這個:

// get content and remove handles
foreach($curly as $id => $c) {

    $result[$id] = curl_multi_getcontent($c);

    $httpCode = curl_getinfo($c, CURLINFO_HTTP_CODE);
    $url      = curl_getinfo($c, CURLINFO_EFFECTIVE_URL);

    if ( $httpCode != 200 ){
        echo $url." Error<br>";
    } else {
        echo $url." Success<br>";
    }

    curl_multi_remove_handle($mh, $c);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM