Php 如何加速检查HTML中链接的类?

Php 如何加速检查HTML中链接的类?,php,html,http,Php,Html,Http,我拼凑了一个类来检查链接。它可以工作,但速度很慢: 该类基本上解析HTML字符串并返回href和src属性的所有无效链接。以下是我如何使用它: $class = new Validurl(array('html' => file_get_contents('http://google.com'))); $invalid_links = $class->check_links(); print_r($invalid_links); 由于HTML有很多链接,它会变得非常慢,我知道它

我拼凑了一个类来检查链接。它可以工作,但速度很慢:

该类基本上解析HTML字符串并返回href和src属性的所有无效链接。以下是我如何使用它:

$class = new Validurl(array('html' => file_get_contents('http://google.com')));

$invalid_links = $class->check_links();

print_r($invalid_links);
由于HTML有很多链接,它会变得非常慢,我知道它必须遍历每个链接并遵循它,但是也许有经验的人可以给我一些关于如何加速它的建议

代码如下:

class Validurl{

    private $html = '';

    public function __construct($params){ 

        $this->html = $params['html'];

    } 

    public function check_links(){

        $invalid_links = array();    

        $all_links = $this->get_links();

        foreach($all_links as $link){

            if(!$this->is_valid_url($link['url'])){

                array_push($invalid_links, $link);

            }

        }

        return  $invalid_links;

    }

    private function get_links() {

        $xml = new DOMDocument();

        @$xml->loadHTML($this->html);

        $links = array();

        foreach($xml->getElementsByTagName('a') as $link) {
            $links[] = array('type' => 'url', 'url' => $link->getAttribute('href'), 'text' => $link->nodeValue);
        }

        foreach($xml->getElementsByTagName('img') as $link) {
            $links[] = array('type' => 'img', 'url' => $link->getAttribute('src'));
        }        

        return $links;
    }

    private function is_valid_url($url){

         if ((strpos($url, "http")) === false) $url = "http://" . $url;

         if (is_array(@get_headers($url))){

              return true;

         }else{

             return false;

         }
    }

}

您可以缓存结果(在DB中,例如:键值存储),以便验证器假设如果链接有效,它将在24小时或一周或类似时间内有效。

首先,我不会将链接和图像推送到数组中,然后在数组中迭代,当您可以直接迭代getElementsByTagName()的结果时。你得为我做两次。您应该以如下方式使用cUrl(在a中找到):


更新:是的,某种缓存也会有所帮助,例如一个SQLITE数据库,其中有一个表用于链接和结果,您可以每天清除该数据库。

您希望
如果((strpos($url,“http”)===false)$url=“http://”$网址将修复大多数链接?那变成
呢?目前,我的班级只检查绝对URL,幸运的是,这就是它所要做的一切!我在想也许用卷发更好?我不确定我的脚本是等待页面加载,还是只是获取标题并关闭连接?请小心,不要打开安全漏洞(即带有URL的外部页面,如“)@Yuliy-谢谢你将记住这一点!这可能会起作用,但老实说,我不打算保存链接,只有当我收集了大量链接时,它才可能变得有用!如果你检查一个网站的多个页面,这应该会提高性能。想想所有的页面设计图像(背景、标题、按钮)
function get_headers_curl($url) 
{ 
    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL,            $url); 
    curl_setopt($ch, CURLOPT_HEADER,         true); 
    curl_setopt($ch, CURLOPT_NOBODY,         true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT,        15); 

    $r = curl_exec($ch); 
    $r = split("\n", $r); 
    return $r; 
}