【问题标题】:Check if links are broken in php检查链接是否在php中损坏
【发布时间】:2013-03-24 03:33:33
【问题描述】:

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

可能与以下内容有关: Check link works and if not visually identify it as broken

【问题讨论】:

  • 相关主题似乎很相关。
  • 使用 curl 检查响应标头并发布有特定问题的代码
  • 此链接是您网站上的某些内容还是其他网站上的内容?
  • 用于其他人网站上的内容。它实际上只是标准的医疗表格,由瑞典的不同城市提供。
  • 链接的问题是相关的,但如果我理解正确的话,这个人正在询问动态链接。我的问题与静态文档有关。我不是专家,但有区别吗?

标签: php


【解决方案1】:

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

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 Status Codes

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

另外一种方法是使用 get_headers 函数。但这只有在您的 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";

希望这对你有帮助:)。

【讨论】:

  • 是否可以从数据库中执行此操作?随着新文档的添加和删除,必须更新链接文档的列表。我认为每次有更改时我们的员工手动更新脚本会有点困难?顺便说一句,谢谢你的回答,让我有一个开始的地方。
  • 如果你想更新数据库,然后编写一些查询来获取信息,然后从中获取链接并使用 php 检查并更新它们
  • 请注意,301 不会重定向到 402。或者网站是 402,但会吐出 301。就像现在我知道这个网站已关闭,但正在返回 301。在一个点我有 402 返回。但是上面的代码认为该站点是有效的并且是正常的,而实际上不是。
【解决方案2】:

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

第一种方式——卷曲

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;
    }
}

First & second solutions

【讨论】:

  • 哪种方式最快,资源消耗更少?
  • 第三种方法中的$handle是什么? @Orel Biton
【解决方案3】:

作为快速解决方法检查,您可以将全局变量 $http_response_header 与 file_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 status codes。

【讨论】:

  • 这不是一个好主意。如果未找到服务器或未响应 ....,某些 PHP 安装会显示警告
  • 您不应在生产服务器中使用 display_errors 或 error_reporting。也可以使用@silence 运算符或 register_shutdown_function php.net/manual/es/function.register-shutdown-function.php 来捕获错误
【解决方案4】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多