我运行一个小型博客网络,我有一个页面,我在我的服务器上显示来自不同博客的最新博客文章。我想扩展此页面,还要使用rss feed包含来自外部博客的新帖子。
目前很容易获得内容,因为它只是一个按日期选择帖子的简单查询,但是在扩展时看到如何制作最有效的设计让我很烦恼。
最简单的解决方案是定期运行从外部站点导入帖子的cronjob,然后将它们保存在数据库中。虽然这可能会使帖子内容被更改或被作者删除,但我仍然会显示“无效内容”。
最好的解决方案是,如果我不必保存帖子,而只是直接在页面上导入它们。但这会如何影响可用性和加载时间?是否有可能缓存源?如果我应该选择使用查询显示内部和外部帖子并直接导入提要的组合,如何将其组合使用“分页”(10页结果页面)?
我希望有人可以帮我提供一个小概念验证代码,或描述他们认为最有效的处理方法。
PS:对于导入Feed,我使用SimplePie http://simplepie.org
提前致谢
答案 0 :(得分:0)
如果您已使用SimplePie,则可以使用其caching mechanism来缓存Feed数据。
要合并内部和外部来源的文章,请创建包含所有文章的数据结构。这可以是按发布时间戳排序的所有项目的数组。然后从这个数组中选择特定页码的文章。
这是一些用于创建帖子组合数组的代码。这应该让您了解所涉及的步骤。 Post类代表一个帖子。内部和外部帖子将转换为帖子并存储在数组 $ posts 中。此数组按时间戳排序,最后所有帖子都会回显。
$ internalPosts 必须包含系统中的帖子和 $ feedUrls 外部Feed的网址。由于我不知道内部帖子的结构,因此您必须调整内部帖子转换为通用帖子的部分。
$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>";
}
为了提高性能,请考虑单独存储组合文章并根据此数据构建页面。然后,您需要在内部发布新文章或刷新外部订阅源的缓存版本时随时更新此组合数据。
如果您需要在原始网站上发布后立即发布外部内容,那么我会联系这些网站,看看是否可以获得更新通知,而不是等待缓存版本过期。
编辑:添加了示例代码。