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

时间:2008-11-07 00:55:35

标签: php

我想创建一个批处理脚本,在数据库中浏览20,000个链接,并清除所有404等。我如何获取远程URL的HTTP状态代码?

最好不要使用卷曲,因为我没有安装它。

5 个答案:

答案 0 :(得分:13)

CURL会很完美但是因为你没有它,你将不得不陷入肮脏的插座。该技术是:

  1. 打开服务器的套接字。
  2. 发送HTTP HEAD请求。
  3. 解析回复。
  4. 这是一个简单的例子:

    <?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);
    
    ?>
    

    更新:我添加了几行来解析网址

答案 1 :(得分:2)

如果我没记错,没有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)

另一种选择是在php中使用已经构建的http客户端类,它可以在不获取整页内容的情况下返回标题,网上应该有一些开源类...

答案 2 :(得分:1)

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

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

希望有所帮助。

答案 3 :(得分:1)

您可以使用PEAR的HTTP :: head功能 http://pear.php.net/manual/en/package.http.http.head.php

答案 4 :(得分:0)

http://www.webmasterworld.com/forum88/12559.htm谷歌搜索了一下这个链接。最新版本接近底部。