如何使用PHP以编程方式检查有效(非死机)链接?

时间:2008-10-28 19:25:05

标签: php url cron

给出一个网址列表,我想检查每个网址:

  • 返回200 OK状态代码
  • 返回X时间内的响应

最终目标是一个能够将URL标记为可能已损坏的系统,以便管理员可以查看它们。

该脚本将使用PHP编写,并且很可能每天通过cron运行。

该脚本将一次处理大约1000个网址。

问题分为两部分:

  • 有没有像这样的操作的重大问题,你遇到了什么问题?
  • 考虑到准确性和性能,在PHP中检查网址状态的最佳方法是什么?

9 个答案:

答案 0 :(得分:18)

使用PHP cURL扩展。与fopen()不同,它还可以发出HTTP HEAD请求,这些请求足以检查URL的可用性并节省大量的带宽,因为您不必下载要检查的整个页面。

作为起点,你可以使用这样的函数:

function is_available($url, $timeout = 30) {
    $ch = curl_init(); // get cURL handle

    // set cURL options
    $opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser
                  CURLOPT_URL => $url,            // set URL
                  CURLOPT_NOBODY => true,         // do a HEAD request only
                  CURLOPT_TIMEOUT => $timeout);   // set timeout
    curl_setopt_array($ch, $opts); 

    curl_exec($ch); // do it!

    $retval = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200; // check if HTTP OK

    curl_close($ch); // close handle

    return $retval;
}

但是,有大量可能的优化:您可能希望重新使用cURL实例,如果每个主机检查多个URL,甚至可以重新使用该连接。

哦,这段代码严格检查HTTP响应代码200.它不遵循重定向(302) - 但也有一个cURL选项。

答案 1 :(得分:6)

查看cURL。有一个PHP库。

还有一个cURL的可执行版本,所以你甚至可以用bash编写脚本。

答案 2 :(得分:4)

我实际上在PHP中写了一些东西,它通过5k + URL的数据库完成。我使用了PEAR类HTTP_Request,它有一个名为getResponseCode()的方法。我只是遍历URL,将它们传递给getResponseCode并评估响应。

但是,它不适用于FTP地址,不以http或https开头的URL(未经证实,但我相信是这种情况),以及安全证书无效的网站(找不到0)。此外,为服务器未找到返回0(没有状态代码)。

它可能比cURL更容易,因为你包含了一些文件并使用单个函数来获取整数代码。

答案 3 :(得分:2)

  1. fopen()支持http URI。
  2. 如果您需要更多灵活性(例如超时),请查看cURL扩展名。

答案 4 :(得分:1)

似乎它可能是curl的工作。

如果你没有坚持使用PHP Perl的LWP也可能是一个答案。

答案 5 :(得分:1)

您还应该知道返回301或302 HTTP响应的URL,这些URL会重定向到另一个页面。通常,这并不意味着链接无效。例如,http://amazon.com返回301并重定向到http://www.amazon.com/

答案 6 :(得分:1)

仅仅返回200响应是不够的;当前所有者未能续约时,许多有效链接在变为色情/赌博门户网站后将继续返回“200”。

域名擅自占地者通常会确保其域中的每个网址都返回200.

答案 7 :(得分:0)

您无疑会遇到的一个潜在问题是,当此脚本运行的框无法访问互联网时...您将获得1000个误报。

您的脚本可能更好地保留某种类型的历史记录,并且仅在失败5天后报告失败。

此外,在继续进行标准检查之前,脚本应该以某种方式进行自我检查(例如检查一个已知的好网站[google?])。

答案 8 :(得分:0)

您只需要一个bash脚本来执行此操作。请在类似的帖子here上查看我的回答。它是一个单线程,可以重用HTTP连接来显着提高速度,重试n次以查找临时错误并遵循重定向。