给出一个网址列表,我想检查每个网址:
最终目标是一个能够将URL标记为可能已损坏的系统,以便管理员可以查看它们。
该脚本将使用PHP编写,并且很可能每天通过cron运行。
该脚本将一次处理大约1000个网址。
问题分为两部分:
答案 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)
答案 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次以查找临时错误并遵循重定向。