题
给予一个名单的网址,我想检查,每个网址:
- 返回200确定状态码
- 返回响应内X量的时间
最终的目标是一个系统,该系统是能够举报网址为潜在的破裂,使管理员可以审查他们。
脚本将PHP编写的并且很可能将运行在日常的基础上通过cron。
脚本将处理大约1000网址在一个去。
问题有两个部分:
- 是否有任何陷阱很有操作的喜欢这个,有什么问题你有没有遇到?
- 什么是最好的方法为检查状态的一个网址在PHP考虑到既准确性和性能吗?
解决方案
使用PHP卷扩展。Unlike fopen()也可以使HTTP头请求它们足够的请的网址和救你一吨的带宽为你不必下载全体的页面检查。
作为一个起点可以使用的某些功能是这样的:
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;
}
然而,有一吨的可能优化:你可能需要重新使用的卷曲的实例,如果检查比一个网址,每主机,甚至重复使用的连接。
哦,这种代码并严格检查HTTP响应的代码200人。它不会跟着重定(302)--但也是卷曲的选择。
其他提示
寻找到的卷曲。有一个图书馆PHP.
还有一个可执行的版本卷所以你甚至可以写的脚本中狂欢。
实际上我写了些东西在PHP,这是否超过一个数据库的5k+网址。我用了梨类 HTTP_Request, ,其中有一个方法被称为 getResponseCode().我只是迭代的网址,将它们传递给getResponseCode和评估的响应。
然而,它不适用于FTP地址、网址,不要开始http或https(未经证实,但我相信这是这种情况),网站与无效的安全证书(一个0不是发现)。此外,一个0是返回的服务器找不到(没有地位代码)。
而且它可能更易于卷曲如你所包括的一些文件,并使用一个单一的功能,以获得一个整数码后面。
- fopen()支持http URI。
- 如果你需要更多的灵活性(例如超时),寻找到的卷曲的扩展。
看来似乎可能的一个工作 卷毛.
如果你不坚持在PHP Perl的行动,可能是一个答案了。
你也应该知道的网址返回301或302HTTP应对其重新定向到另一个网页。一般来说,这并不意味着该链接是无效的。例如, http://amazon.com 返回301和重定向到 http://www.amazon.com/.
只是返回的一个200反应是不够的;许多有效的联系将继续返回"200"之后他们变成色情/赌博的门户网站的当前所有者无法更新。
域名棚户区居民通常是确保每一网址在其领域内的返回200人。
一个潜在的问题,你会骗人遇到的是当框这个脚本上运行的失去访问互联网...你会得到1000误报。
它可能会更适合你的脚要保持某种类型的历史,并仅报告一个失败后5天的失败。
此外,脚本应该是自我检查的一些方法(如检查一个已知良好的网站[谷歌?]) 在继续之前的标准检查。
你只需要一个bash脚本来做到这一点。请检查我的答案对一个类似的职位 在这里,.它是一个衬垫,重新使用HTTP连接到大幅提高速度、重试n次临时的错误和下重定向。