给出一个网址列表,我想检查每个网址:
返回200 OK状态代码
返回X时间内的响应
最终目标是一个能够将URL标记为可能已损坏的系统,以便管理员可以查看它们.
该脚本将使用PHP编写,并且很可能每天通过cron运行.
该脚本将一次处理大约1000个网址.
问题分为两部分:
有没有像这样的操作的重大陷阱,你遇到了什么问题?
考虑到准确性和性能,在PHP中检查URL状态的最佳方法是什么?
Henning.. 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选项.
使用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选项.
看看cURL.有一个PHP库.
还有一个cURL的可执行版本,所以你甚至可以用bash编写脚本.