2010-08-12 76 views
0

我運行一個小型博客網絡,在此我有一個頁面,顯示來自服務器上不同博客的最新博客文章。我想擴展這個頁面,也包括使用rss feeds的外部博客的新帖子。導入rss提要和可用性

目前很容易獲取內容,因爲它只是一個簡單的查詢選擇日期的帖子,但它使我很難看到如何在擴展它時做出最有效的設計。

最簡單的解決方案是定期運行一個cronjob,從外部站點導入帖子,然後將它們保存在數據庫中。雖然這可能會導致帖子可能會被內容更改或被作者刪除,從而導致我顯示「無效內容」。

最好的解決方案是,如果我不必保存帖子,而是直接在頁面上導入它們。但這將如何影響可用性和加載時間?是否有可能緩存飼料?如果我應該選擇使用查詢顯示內部和外部帖子並直接導入供稿的組合,如何組合使用「分頁」(10個結果頁面)?

我希望有人可以幫助我一小段概念代碼證明,或者描述他們認爲會是處理這個問題的最有效方法。

PS:對於進口飼料我使用了SimplePie http://simplepie.org

在此先感謝

回答

0

如果您已經使用了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