Импорт RSS-каналов и удобство использования - PullRequest
0 голосов
/ 12 августа 2010

Я управляю небольшой сетью блогов, и на этой странице у меня есть страница, на которой я показываю последние сообщения из разных блогов на моем сервере.Я хотел бы расширить эту страницу, включив в нее также новые сообщения из внешних блогов, используя RSS-каналы.

В настоящее время контент легко получить, так как это простой запрос, выбирающий сообщения по дате, но меня беспокоитузнайте, как сделать наиболее эффективный дизайн при его расширении.

Самым простым решением будет периодический запуск cronjob, который импортирует сообщения с внешних сайтов, а затем сохраняет их в базе данных.Хотя это создает вероятность того, что сообщения могут быть изменены по содержанию или удалены автором, в результате чего я могу отображать «недопустимый контент».

Лучшее решение будет, если мне не нужно сохранять сообщения,и вместо этого просто импортируйте их прямо на странице.Но как это повлияет на удобство использования и время загрузки?Возможно ли как-то кэшировать каналы?Если мне нужно выбрать комбинацию отображения внутренних и внешних сообщений с использованием запроса и импорта каналов напрямую, как это можно комбинировать для использования «нумерации страниц» (10 страниц результатов)?

Я надеюсь, что кто-то может мне помочьс небольшим доказательством концептуального кода или опишите, что, по их мнению, будет наиболее эффективным способом решения этой проблемы.

PS: для импорта каналов я использую SimplePie http://simplepie.org

Заранее спасибо

1 Ответ

0 голосов
/ 13 августа 2010

Если вы уже используете SimplePie, вы можете использовать механизм кэширования для кэширования данных фида.

Для объединения статей из внутренних и внешних источников создайте структуру данных со всеми статьями.Это может быть массив всех элементов, отсортированных по метке времени публикации.Затем из этого массива выберите статьи для определенного номера страницы.

Вот некоторый код для создания объединенного массива постов.Это должно дать вам представление о шагах.Класс 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>"; 
}

Для повышения производительности рассмотрите возможность хранения объединенных статей отдельно и построения страниц из этого.данные.Затем вам необходимо обновлять эти объединенные данные каждый раз, когда новая статья публикуется внутри страны или обновляется кэшированная версия внешнего канала.

Если вам необходимо опубликовать внешний контент вскоре после его публикации на исходном сайте, тогдаЯ бы связался с этими сайтами, чтобы узнать, возможно ли получить уведомление об обновлениях вместо ожидания истечения срока действия кэшированной версии.

РЕДАКТИРОВАТЬ: добавлен пример кода.

...