如何在php中获取远程域的HTTP状态代码?

如何在php中获取远程域的HTTP状态代码?,php,Php,我想创建一个批处理脚本,在一个数据库中遍历20000个链接,并删除所有404等等。如何获取远程url的HTTP状态码 最好不要使用curl,因为我没有安装它 卷发很完美,但既然你没有卷发,你就得趴下来,用牙套把头发弄脏。技术是: 打开服务器的套接字 发送HTTP头请求 解析响应 下面是一个简单的例子: <?php $url = parse_url('http://www.example.com/index.html'); $host = $url['host']; $port = $u

我想创建一个批处理脚本,在一个数据库中遍历20000个链接,并删除所有404等等。如何获取远程url的HTTP状态码


最好不要使用curl,因为我没有安装它

卷发很完美,但既然你没有卷发,你就得趴下来,用牙套把头发弄脏。技术是:

  • 打开服务器的套接字
  • 发送HTTP头请求
  • 解析响应
  • 下面是一个简单的例子:

    <?php
    
    $url = parse_url('http://www.example.com/index.html');
    
    $host = $url['host'];
    $port = $url['port'];
    $path = $url['path'];
    $query = $url['query'];
    if(!$port)
        $port = 80;
    
    $request = "HEAD $path?$query HTTP/1.1\r\n"
              ."Host: $host\r\n"
              ."Connection: close\r\n"
              ."\r\n";
    
    $address = gethostbyname($host);
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    socket_connect($socket, $address, $port);
    
    socket_write($socket, $request, strlen($request));
    
    $response = split(' ', socket_read($socket, 1024));
    
    print "<p>Response: ". $response[1] ."</p>\r\n";
    
    socket_close($socket);
    
    ?>
    
    
    
    更新:我添加了几行代码来解析URL

    看起来它有一个非常好的设置,可以使用curl或fsockopen下载页面,并且可以使用任意一种方法获取HTTP头(这是您真正想要的)

    使用该方法后,您需要检查$output['info']['http_code']以获取所需的数据


    希望对您有所帮助。

    您可以使用PEAR的HTTP::head函数。

    如果我没有弄错,php内置函数都不会返回远程url的http状态,因此最好的选择是使用套接字打开与服务器的连接,发送请求并解析响应状态:

    伪代码:

    parse url => $host, $port, $path
    $http_request = "GET $path HTTP/1.0\nHhost: $host\n\n";
    $fp = fsockopen($host, $port, $errno, $errstr, $timeout), check for any errors
    fwrite($fp, $request)
    while (!feof($fp)) {
       $headers .= fgets($fp, 4096);
       $status = <parse $headers >
       if (<status read>)
         break;
    }
    fclose($fp)
    
    parse url=>$host、$port、$path
    $http\u request=“GET$path http/1.0\nHhost:$host\n\n”;
    $fp=fsockopen($host、$port、$errno、$errstr、$timeout),检查是否有任何错误
    fwrite($fp,$request)
    而(!feof($fp)){
    $headers.=fgets($fp,4096);
    $status=
    如果()
    打破
    }
    fclose($fp)
    

    另一个选择是在php中使用一个已经构建好的http客户机类,该类可以返回标题而不获取整个页面内容,网络上应该有一些开源类…

    我相信是:。我会纠正这个小错误。我应该指出,并不是所有的web服务器都支持或启用HEAD请求,即使命中HEAD请求的几率接近于零。。。