导入rss提要和可用性

问题描述:

我运行一个小型博客网络,在此我有一个页面,显示来自服务器上不同博客的最新博客文章。我想扩展这个页面,也包括使用rss feeds的外部博客的新帖子。导入rss提要和可用性

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

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

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

我希望有人可以帮助我一小段概念代码证明,或者描述他们认为会是处理这个问题的最有效方法。

PS:对于进口饲料我使用了SimplePie http://simplepie.org

在此先感谢

如果您已经使用了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>"; 
} 

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

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

编辑:添加示例代码。

+0

感谢您的回复! - 我不喜欢选项1(尽管这会是最简单的),因为每次更改页码时都需要获取所有数据。我不需要立即发布外部内容,所以我相信使用缓存过期将是最好的方式。你能否提供一个选项2概念代码的小样本?它不需要工作,只是一小段代码解释如何做到这一点。在此先感谢 – Kristian 2010-08-13 19:16:43

+0

您的意思是创建一个组合的文章阵列? – Kwebble 2010-08-13 20:44:05

+0

是的。我的麻烦在于如何处理外部帖子并以正确的方式连接它们。 – Kristian 2010-08-13 20:54:55