【问题标题】:Import rss feeds and usability导入 RSS 提要和可用性
【发布时间】:2010-08-12 16:36:51
【问题描述】:

我运行一个小型博客网络,在此我有一个页面,其中显示来自我服务器上不同博客的最新博客文章。我想扩展此页面,以包含来自使用 rss 源的外部博客的新帖子。

目前获取内容很容易,因为它只是一个按日期选择帖子的简单查询,但是在扩展它时如何做出最有效的设计让我很困扰。

最简单的解决方案是定期运行从外部站点导入帖子的 cronjob,然后将它们保存在数据库中。尽管这可能会导致帖子的内容被更改或被作者删除,从而让我显示“无效内容”。

如果我不必保存帖子,最好的解决方案是直接在页面上导入它们。但这将如何影响可用性和加载时间?是否有可能缓存提要?如果我应该选择使用查询显示内部和外部帖子并直接导入提要的组合,如何结合使用“分页”(每页 10 个结果)?

我希望有人可以帮助我提供一个小的概念验证代码,或者描述他们认为最有效的处理方式。

PS:对于导入提要,我使用 SimplePie http://simplepie.org

提前致谢

【问题讨论】:

    标签: rss import feed


    【解决方案1】:

    如果您已经使用 SimplePie,那么您可以使用它的caching mechanism 来缓存提要数据。

    要合并来自内部和外部来源的文章,请创建一个包含所有文章的数据结构。这可以是按发布时间戳排序的所有项目的数组。然后从这个数组中选择特定页码的文章。

    下面是一些用于创建帖子组合数组的代码。这应该让您了解所涉及的步骤。 Post 类代表一个帖子。内部和外部帖子被转换为一个帖子并存储在数组 $posts 中。该数组按时间戳排序,最后所有帖子都会回显。

    $internalPosts 必须包含来自您系统的帖子和 $feedUrls 外部供稿的 URL。由于我不知道内部帖子的结构,您必须调整内部帖子转换为通用帖子的部分。

    $internalPosts = array();
    $feedUrls = array();
    
    include_once 'simplepie.inc';
    
    class Post {
        public $title;
        public $link;
        public $description;
        public $publishedAt;
    
        public function __construct($title, $link, $description, $publishedAt) {
            $this->title = $title;
            $this->link = $link;
            $this->description = $description;
            $this->publishedAt = $publishedAt;
        }   
    }
    
    $posts = array();
    
    // Convert internal posts to generic post.
    foreach($internalPosts as $item){
        $posts[] = new Post($item->title, $item->link, $item->description, $item->publishedAt);
    }
    
    // Retrieve feeds and add posts.
    $feed = new SimplePie();
    
    foreach($feedUrls as $url){
        $feed->set_feed_url($url);
        $feed->init();
    
        foreach ($feed->get_items() as $item) {
            $posts[] = new Post($item->get_title(), $item->get_link(), $item->get_description(), $item->get_date('U'));
        }
    }
    
    // Sort function.
    function byPublicationTimestamp($itemA, $itemB){
        return ($itemB->publishedAt - $itemA->publishedAt);
    }
    
    usort($posts, 'byPublicationTimestamp');
    
    foreach($posts as $post){
        echo "<p><a href='$post->link'>$post->title</a><br/>" . date('l, j F Y', $post->publishedAt) . " - $post->description</p>"; 
    }
    

    为了提高性能,请考虑单独存储合并的文章并根据这些数据构建页面。然后,您需要在内部发布新文章或刷新外部提要的缓存版本时更新此组合数据。

    如果您需要在原始网站上发布后不久发布外部内容,那么我会联系这些网站,看看是否可以收到更新通知,而不是等待缓存版本过期。

    编辑:添加示例代码。

    【讨论】:

    • 感谢您的回复! - 我不喜欢选项 1(即使那是最简单的),因为这样我每次更改页码时都需要获取所有数据。我不需要立即发布外部内容,所以我相信使用缓存过期将是最好的方法。您能否提供选项 2 的小型概念验证代码?它不需要工作,只需一小段代码解释如何做到这一点。提前致谢
    • 您的意思是创建一个组合的文章数组吗?
    • 是的。我的麻烦在于如何处理外部帖子并以正确的方式连接它们。
    • 您的示例提供了一种组合两个数据源的好方法!但是,因为我需要将结果分成 10 个帖子。页面,我相信如果我有大量帖子,这种方法会产生糟糕的性能?只有一个数据源,我会直接在我的查询中限制结果。使用您的方法,我必须获取所有内部和外部帖子,然后在最终拆分之前将它们组合起来。有什么聪明的方法可以做到这一点吗?再次感谢,非常感谢您的帮助。
    • 这就是我建议存储组合数据的原因。也许您可以在自己的系统中插入外部文章,使用特定的标签/标签/类别来识别它们。然后就可以查询正常的数据库了。或者用合并的文章创建一个新表并查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多