Php 快速获取Url的http响应代码

Php 快速获取Url的http响应代码,php,curl,Php,Curl,我知道获取http响应代码非常容易,比如我们可以使用get_headers()函数,也可以使用cURL,但我有300万个url 所以,请告诉我如何快速获取每个url的状态 因为在当前场景中,每个url大约需要1秒的时间,所以您可以计算完成需要多少时间 error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); $row = 1; if (($handle = fopen("2.6MMURL-10-14.csv", "r")) !== FALS

我知道获取http响应代码非常容易,比如我们可以使用get_headers()函数,也可以使用cURL,但我有300万个url

所以,请告诉我如何快速获取每个url的状态

因为在当前场景中,每个url大约需要1秒的时间,所以您可以计算完成需要多少时间

error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
$row = 1;
if (($handle = fopen("2.6MMURL-10-14.csv", "r")) !== FALSE) {
$i = 1;
//echo '<pre>';
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

       //print_r($data[0]);
       $result = getStatus($data[0]);
       echo  $result."<br />";
      // print_r($result); 
       if($i == 16)
       {
       echo $i;
       //appendToCsv($result);

       //exit;
       }

       $i++;
    }


    fclose($handle);
}
exit;
function getStatus($fileSource) {
//$fileSource = "www.google.com";
$time = date("Y-m-d H:i:s");
    $ch = curl_init($fileSource);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1');         
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HEADER, true);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
  curl_setopt($ch, CURLOPT_NOBODY, true);
  $last_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
  $response = curl_exec($ch);
  //print_r($response); exit;
  preg_match_all('/^Location:(.*)$/mi', $response, $matches);
  $retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

  curl_close($ch);
  //!empty($matches[1]) ? $redirect = trim($matches[1][0]) : $redirect = 'No redirect found';
  $redirect = trim($matches[1][0]);
$time.= date("Y-m-d H:i:s");
$array = "$fileSource, $retcode, $trim($matches[1][0], $time";
return $array;
    //print_r($last_url); exit;

    //curl_close($ch);
    }

function appendToCsv($data) {
    header('Content-Type: application/excel');
header('Content-Disposition: attachment; filename="sample.csv"');


$fp = fopen('php://output', 'w');
foreach ( $data as $line ) {
    $val = explode(",", $line);
    fputcsv($fp, $val);
}
fclose($fp);

}
error\u reporting(E\u ALL&~E\u NOTICE&~E\u WARNING);
$row=1;
如果($handle=fopen(“2.6MMURL-10-14.csv”,“r”))!==FALSE){
$i=1;
//回声';
while(($data=fgetcsv($handle,1000,“,”)!==FALSE){
//打印(数据[0]);
$result=getStatus($data[0]);
回显$result。“
”; //打印(结果); 如果($i==16) { echo$i; //附录(结果); //退出; } $i++; } fclose($handle); } 出口 函数getStatus($fileSource){ //$fileSource=“www.google.com”; $time=日期(“Y-m-d H:i:s”); $ch=curl\u init($fileSource); curl_setopt($ch,CURLOPT_NOBODY,true); curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0(Windows;U;Windows NT 5.1;en-US;rv:1.8.1.1)Gecko/20061204 Firefox/2.0.0.1'); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_头,true); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false); curl_setopt($ch,CURLOPT_NOBODY,true); $last\u url=curl\u getinfo($ch,CURLINFO\u有效的\u url); $response=curl\u exec($ch); //打印($response);退出; preg_match_all('/^Location:(.*)$/mi',$response,$matches); $retcode=curl\u getinfo($ch,CURLINFO\u HTTP\u代码); 卷曲关闭($ch); //!empty($matches[1])?$redirect=trim($matches[1][0]):$redirect='未找到重定向'; $redirect=trim($matches[1][0]); $time.=日期(“Y-m-d H:i:s”); $array=“$fileSource,$retcode,$trim($matches[1][0],$time;”; 返回$array; //打印(最后一个url);退出; //卷曲关闭($ch); } 函数appendToCsv($data){ 标题(“内容类型:应用程序/excel”); 标题('Content-Disposition:attachment;filename=“sample.csv”'); $fp=fopen('php://output","w",; foreach($行数据){ $val=分解(“,”,$line); fputcsv($fp$val); } fclose($fp); }
我建议使用curl\u multi\u exec并行运行多个HEAD HTTP请求。HEAD请求与GET相同,但没有响应正文。这也会节省一些带宽/时间。

您需要使用pcntl\u fork()


请参见

到目前为止您尝试了哪些代码?开始并行运行请求。除非您是在300波特的拨号线路上执行此操作,否则您几乎无法加快网络组件的速度。因此,要么并行运行更多请求(简单),要么找到某种方法缩短每个请求的时间(困难/不可能).使用wget,类似这样的东西-我添加了代码@Mr.Concolato