18

我想知道是否有任何好的 PHP 脚本(库)来检查链接是否损坏?我在 mysql 表中有指向文档的链接,并且可能只检查链接是否指向文档,或者我是否被重定向到另一个 url。任何的想法?我宁愿用 PHP 来做。

可能与: 检查链接是否有效,如果没有直观地识别为已损坏

4

4 回答 4

29

您可以使用此功能检查断开的链接:

function check_url($url) {

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    $headers = curl_getinfo($ch);
    curl_close($ch);

    return $headers['http_code'];
}

您需要CURL安装它才能工作。现在您可以使用以下方法检查损坏的链接:

$check_url_status = check_url($url);
if ($check_url_status == '200')
   echo "Link Works";
else
   echo "Broken Link";

另请检查此链接以获取 HTTP 状态代码:HTTP 状态代码

我认为您还可以检查301状态302代码。

另一种方法是使用get_headersfunction 。但这仅在您的 PHP 版本大于 5 时才有效:

function check_url($url) {
   $headers = @get_headers( $url);
   $headers = (is_array($headers)) ? implode( "\n ", $headers) : $headers;

   return (bool)preg_match('#^HTTP/.*\s+[(200|301|302)]+\s#i', $headers);
}

在这种情况下,只需检查输出:

if (check_url($url))
   echo "Link Works";
else
   echo "Broken Link";

希望这可以帮助你:)。

于 2013-04-02T18:17:18.363 回答
5

您可以通过以下几种方式做到这一点:

第一种方式——卷曲

function url_exists($url) {
    $ch = @curl_init($url);
    @curl_setopt($ch, CURLOPT_HEADER, TRUE);
    @curl_setopt($ch, CURLOPT_NOBODY, TRUE);
    @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
    @curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $status = array();
    preg_match('/HTTP\/.* ([0-9]+) .*/', @curl_exec($ch) , $status);
    return ($status[1] == 200);
}

第二种方式 - 如果你没有安装 curl - 获取标题

function url_exists($url) {
    $h = get_headers($url);
    $status = array();
    preg_match('/HTTP\/.* ([0-9]+) .*/', $h[0] , $status);
    return ($status[1] == 200);
}

第三种方式——fopen

function url_exists($url){
    $open = @fopen($url,'r');
    if($handle !== false){
       return true;
    }else{
       return false;
    }
}

第一和第二解决方案

于 2013-04-02T18:15:23.613 回答
2

作为快速解决方法检查,您可以将全局变量$http_response_headerfile_get_contents()函数一起使用。

例如(摘自 PHP 文档):

<?php
function get_contents() {
  file_get_contents("http://example.com");
  var_dump($http_response_header);
}
get_contents();
var_dump($http_response_header);

然后检查第一行的状态代码是否有“HTTP/1.1 200 OK”或其他HTTP 状态代码

于 2013-04-02T18:01:46.770 回答
1

试试这个:

$url = '[your_url]';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($curl);

if ($result === false) {
    echo 'broken url';
} else {
    $newUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);

    if ($newUrl !== $url) {
        echo 'redirect to: ' . $newUrl;
    }
}
curl_close($curl);
于 2013-04-02T18:09:27.070 回答