代码之家  ›  专栏  ›  技术社区  ›  GloryFish

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

  •  15
  • GloryFish  · 技术社区  · 17 年前

    给定一个URL列表,我想检查每个URL:

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

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

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

    脚本将一次处理大约1000个URL。

    问题分为两部分:

    • 像这样的操作有什么大问题吗?你遇到了什么问题?
    • 考虑到准确性和性能,在PHP中检查URL状态的最佳方法是什么?
    9 回复  |  直到 9 年前
        1
  •  18
  •   Henning    17 年前

    使用php curl扩展。与fopen()不同,它还可以发出HTTP头请求,这些请求足以检查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选项。

        2
  •  6
  •   antik    17 年前

    看看卷发。有一个PHP库。

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

        3
  •  4
  •   Thomas Owens    17 年前

    我实际上用PHP写了一些东西,通过一个5K+URL的数据库来完成这项工作。我上过梨课 HTTP_Request ,其方法名为 getResponseCode ()我只是迭代这些URL,将它们传递给getResponseCode并评估响应。

    但是,它不适用于ftp地址、不以http或http s开头的URL(未确认,但我相信是这样),以及具有无效安全证书的站点(未找到0)。此外,如果找不到服务器,则返回0(没有状态代码)。

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

        4
  •  2
  •   Serge Wautier    17 年前
    1. fopen()支持HTTP URI。
    2. 如果您需要更多的灵活性(如超时),请查看curl扩展。
        5
  •  1
  •   Chris Kloberdanz    17 年前

    似乎这是一份工作 curl .

    如果您不坚持使用php,那么Perl的lwp也可能是一个答案。

        6
  •  1
  •   Kip    17 年前

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

        7
  •  1
  •   MarkR    17 年前

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

    域占用者通常确保其域中的每个URL返回200。

        8
  •  0
  •   BoltBait    17 年前

    毫无疑问,你会遇到一个潜在的问题,那就是当运行这个脚本的盒子无法访问互联网时…你会得到1000个误报。

    您的脚本最好保留某种类型的历史记录,并且只在失败5天后报告失败。

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

        9
  •  0
  •   Community Mohan Dere    9 年前

    您只需要一个bash脚本就可以做到这一点。请在类似的帖子上检查我的答案 here . 它是一个一行程序,可以重用HTTP连接以显著提高速度,对临时错误重试n次,并遵循重定向。