最快&;检索文章最终URL和图像的有效方式


Quickest & Efficient way of retrieving article final URL and images

我编写了一个PHP脚本来解析RSS提要,并尝试从og:image元标记中获取打开的图形图像。

为了获得图像,我需要检查RSS提要中的URL是否为301重定向。这种情况经常发生,这意味着我需要按照任何重定向到结果URL。这意味着脚本运行非常缓慢。有没有更快、更有效的方法来实现这一点?

以下是获取最终URL的函数:

function curl_get_contents($url) {
$agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result=curl_exec($ch);
return $result; 
}

这是检索og图像的功能(如果存在(:

function getog($url) {
    $doc = new DomDocument();
    $doc->loadHTML(curl_get_contents($url));
    if($doc == "") {return;}
    $xpath = new DOMXPath($doc);
    $query = '//*/meta[starts-with(@property, ''og:'')]';
    $queryT = '';
    $metas = $xpath->query($query);
    foreach ($metas as $meta) {
        $property = $meta->getAttribute('property');
        $content = $meta->getAttribute('content');
        if($property == "og:url"   && $ogProperty['url'] == "")     {$ogProperty['url'] = $content;}
        if($property == "og:title" && $ogProperty['title'] == "")   {$ogProperty['title'] = $content;}
        if($property == "og:image" && $ogProperty['image'] == "")   {$ogProperty['image'] = $content;}
    }
    return $ogProperty;
}

脚本还有很多内容,但这些功能是瓶颈。我还缓存到一个文本文件,这意味着它在第一次运行后会更快。

如何加快脚本的速度以检索最终url并从RSS提要中的链接中获取图像url?

您可以使用Facebook的OG API。Facebook使用它从任何URL中删除重要信息。与通常的刮削方法相比,它相当快。

你可以这样做。。

og_scrapping.php:

    function meta_scrap($url){
        $link = 'https://graph.facebook.com/?id='.$url.'&scrape=true&method=post';
        $ch = curl_get_contents($link);
        return json_decode($ch);
    }

然后只需在包含og_scrapping.php之后的任意位置调用它print_r(meta_scrap('http://www.example.com');您将获得一个数组,然后您可以根据需要获得选择性内容。

对于标题、图像、url和描述,您可以通过以下方式获取:

$title = $output->title;
$image = $output->image[0]->url;
$description = $output->description;
$url = $output->url;  

报废图像时出现重大问题。获得标题和描述很容易。阅读本文以更快的方式获取图像。此外,这将帮助您节省几秒钟的时间。

恐怕您无法加快提取过程本身。一个可能的改进是采用字符串方式进行图像提取,即使用regex关注og:标签,尽管通常强烈建议不要这样做。

这有的主要缺点,即如果对源进行更改,则很容易中断,并且与更稳定的DOM解析方法相比,没有显著的速度优势。


我还缓存到一个文本文件,这意味着它在第一次运行后会更快。

另一方面,您可能会使用一种始终只向用户提供缓存的方法,并在每次请求时使用异步调用更新缓存。

正如CBroe对您的回答所评论的:

没有办法加快以下重定向。客户端必须提出一个新的请求,这需要花费一些时间。使用CURLOPT_FOLLOWLOCATIONcURL已经自动完成了这一操作,因此您不可能插入以加快速度。

这意味着它在您的Web服务器上不是一项繁重的任务,而是一项冗长的任务,因为它必须执行大量请求。这是一个非常开始异步思考的良好基础:

  1. 您收到一个正在查找RSS项目的请求
  2. 您可以非常快速地从缓存中提供响应
  3. 如果需要,您可以发送一个异步请求来重建缓存-由于重定向和DOM解析,这是最长的部分,但请求RSS项目列表的原始客户端/对等方不必等待此操作完成;也就是说,对于这个列表,发送重建请求本身只需要几微秒的时间
  4. 您将返回缓存的项目

PHP 中的异步shell exec

如果你走这条路,在你的情况下,你会遇到以下优势:

  • 以高加载速度提供快速内容服务
  • 在重建高速缓存时没有降低加载速度

但是,以下缺点

  • 请求更新的提要的第一个用户不立即*接收最新项目
  • 第一个项目之后的后续用户不会立即*接收最新项目,直到缓存就绪

*好消息是,您可以使用循环的定时AJAX请求来检查RSS项目缓存中是否有任何新项目,从而几乎完美地消除所有缺点

如果有,您可以在顶部(或底部(显示一条消息,通知用户新内容的到来,并在用户单击通知时附加该内容。

与不使用循环AJAX调用而始终提供缓存内容相比,这种方法将实时RSS出现和项目出现在网站上之间的延迟减少到最大时间n + m,其中n是AJAX请求间隔,m是重建缓存所需的时间。

Meta存储在"head"元素中。

在你的Xpath中,你必须考虑头部元素:

$query = '//head/meta[starts-with(@property, ''og:'')]';

当您可以在"head"元素结束后停止检索时,您将浪费一些时间来检索、存储和解析整个html文件。此外,当你只想要1k时,为什么要得到一个40k的网页?

您"可能"会考虑在seing结束的"head"元素之后停止检索。当没有其他事情可做时,它可以加快速度,但它是一个顽皮的不总是工作的黑客。