Php 如何加速检查HTML中链接的类?
我拼凑了一个类来检查链接。它可以工作,但速度很慢: 该类基本上解析HTML字符串并返回href和src属性的所有无效链接。以下是我如何使用它: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有很多链接,它会变得非常慢,我知道它
$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;
}