从网站获取元数据的最快方法

4
我正在尝试从网站中获取标题,目前我使用preg_match获取标题,但加载非常慢。
目前的代码如下:
该代码将链接传递到一个函数中:
<?php 
foreach($savedLinks as $s)
{
    echo "<div class='savedLink'>";
        echo "<h5>" . getMetaData($s) . "</h5>";
        echo "<a href='" . $s . "'>" . $s . "</a><br />";
    echo "</div>";
}
?>

这个函数从传入的每个网站中获取标题:

function getMetaData($url)
{
    if(!@file_get_contents($url))
    {
        return "";
    }
    else
    {
        if(preg_match('/<title>(.+)<\/title>/',file_get_contents($url),$matches) && isset($matches[1]))
            return $matches[1];
        else
            return "Not Found";  
    }
}

有没有快速获取每个页面的“标题”的方法?

1
文档对象模型 (DOM) - user557846
我尝试过使用DOM,但是当尝试从大约10个页面中获取“标题”时,加载速度变得非常缓慢。 - Julian Barrie
2个回答

1
我猜测file_get_contents的速度比preg_match慢得多,而我预计preg_match应该非常快。
如果您要在许多站点上执行此操作,则此方法可能无法正常工作,但您可能需要查看字节范围请求。 如果您可以预测标题标记位于HTML响应的前X个字节内,您可以使用字节范围进行部分请求,并避免必须将整个文档移到线上仅获取标题标记。 如果页面是动态生成的,则需要服务器上的代码支持此功能。 如果它们是静态文档,则很可能支持字节范围请求。

https://serverfault.com/questions/398219/how-can-i-enable-byte-range-request

如第二个答案所示,尝试通过将“Connection:close”更改为“Connection:keep-alive”来启用保持连接。同样,这仅在您多次访问同一服务器且该服务器已启用保持连接时才有效。这两个因素结合起来可以节省每个请求的大量时间。

我不太确定如何使用这种方法获取网站的“标题”? - Julian Barrie
你能否发布一个URL,以便我可以查看它是否正确支持字节范围请求,并发布一些可工作的代码? - roktechie
很遗憾,YouTube不支持对其HTML页面进行字节范围请求。我发送了一个范围标头,并收到了一个200响应,而不是预期的206“部分”。如果您的目标是YouTube,您只需要获得更快的连接才能工作。尝试使用curl,这样您就可以请求Connection: keepalive,这应该会使后续请求稍微快一些(也许)。 - roktechie

0

嗨,我已经尝试了你的方法,但在获取10个以上不同网站的标题时,加载页面仍需要大约10秒钟。 - Julian Barrie
你不能忽略与其他网站的连接时间。除非你有非常高速的互联网连接,否则不可能实现。 - Anam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接