2009-11-12 115 views

回答

8
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); //follow up to 10 redirections - avoids loops 
$data = curl_exec($ch); 
curl_close($ch); 
if (!$data) { 
    echo "Domain could not be found"; 
} 
else { 
    preg_match_all("/HTTP\/1\.[1|0]\s(\d{3})/",$data,$matches); 
    $code = end($matches[1]); 
    if ($code == 200) { 
    echo "Page Found"; 
    } 
    elseif ($code == 404) { 
    echo "Page Not Found"; 
    } 
} 
here的代码

修改版本。

1

我最近在寻找相同的信息。发现了一些非常好的代码在这里:http://php.assistprogramming.com/check-website-status-using-php-and-curl-library.html

function Visit($url){ 

    $agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; 
    $ch = curl_init(); 
    curl_setopt ($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch,CURLOPT_VERBOSE,false); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
    $page=curl_exec($ch); 
    //echo curl_error($ch); 
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 




    if($httpcode >= 200 && $httpcode < 300){ 
     return true; 
    } 
    else { 
     return false; 
    } 

} 

    if(Visit("http://www.site.com")){ 
     echo "Website OK"; 
    } 
    else{ 
     echo "Website DOWN"; 
    } 
+0

'304 Not Modified','307 Temporary Redirect',等等? – nickf 2009-11-12 14:49:29

+0

@nickf - 在卷曲获取的上下文中,“304未修改”是否相关?我不知道curl发送了什么头文件 - 假设它不发送除您指定的内容以外的任何内容,服务器如何知道自上次请求它之后页面是否已被修改? – 2009-11-12 14:51:52

2

我喜欢卷曲或到的fsockopen解决这个问题。任何一个人都可以提供有关所请求文件状态的标题数据。具体来说,你会找一个404(文件未找到)响应。下面是我用的fsockopen使用的例子:

http://www.php.net/manual/en/function.fsockopen.php#39948

+2

当然,这应该是404“未找到”,而不是404“未找到文件” – 2009-11-12 14:49:00

2

该函数将返回响应代码(最后一个重定向的情况下),或者虚假的DNS或其它错误的情况下。如果提供了一个参数(url),则会发出HEAD请求。如果给出第二个参数,则完成一个完整的请求,响应的内容(如果有的话)通过引用存储在作为第二个参数传递的变量中。

function url_response_code($url, & $contents = null) 
{ 
    $context = null; 
    if (func_num_args() == 1) { 
     $context = stream_context_create(array('http' => array('method' => 'HEAD'))); 
    } 
    $contents = @file_get_contents($url, null, $context); 
    $code = false; 
    if (isset($http_response_header)) { 
     foreach ($http_response_header as $header) { 
      if (strpos($header, 'HTTP/') === 0) { 
       list(, $code) = explode(' ', $header); 
      } 
     } 
    } 
    return $code; 
} 
0

只需注意,这些解决方案在无法针对未找到页面给出适当响应的网站上无法正常工作。例如,我在测试网站上的页面时遇到问题,因为它只是在获取无法处理的请求时加载主站点页面。因此,即使对于不存在的网页,该网站也几乎总是会提供200个响应。

有些网站会在标准页面上提供自定义错误,但不会提供404头。

在这些情况下你可以做的事情并不多,除非你知道页面的预期内容,并开始测试预期的内容是否存在,或者测试页面中的一些预期的错误文本,并且这一切都变得有点麻烦......

+0

如果可能,请尝试添加一些对您的解释的引用。 – DontVoteMeDown 2013-06-18 13:26:06