Пишем RSS ленту на PHP

  В этой заметке описывается PHP-скрипт для генерации RSS-ленты, который Иван Скляров  написал для своего сайта.

Немного теории. RSS лента представляет собой обычный XML-файл, вот пример:

<?xml version="1.0" encoding="windows-1251"?>
   <rss version="2.0">
     <channel>
       <title>SKLYAROFF</title>
       <link>http://www.sklyaroff.ru/</link>
       <description>MY BLOG</description>
       <copyright>Copyright (c) Sklyaroff Ivan</copyright>
 
   <item>
     <title>С 18 Ноября "X-Puzzle" в "][акере"</title>
     <link>http://www.sklyaroff.ru/comm.php?mess=111</link>
     <pubDate>Sat, 22 Nov 2008 06:20:20 +0300</pubDate>
     <description>Покупаем ноябрьский номер ][акера, решаем головоломки в моей рубрике "X-Puzzle"…</description>
   </item>
 
   <item>
     <title>Простенькая задачка для начинающих и заканчивающих программистов</title>
     <link>http://www.sklyaroff.ru/comm.php?mess=110</link>
     <pubDate>Fri, 21 Nov 2008 05:47:02 +0300</pubDate>
     <description>Понадобились мне тут числа (много чисел) делящиеся нацело на 9, делящиеся нацело на 13, делящиеся нацело на 125…
     </description>
   </item>
 
 
   <item>
     <title>Валидный сайт</title>
     <link>http://www.sklyaroff.ru/comm.php?mess=106</link>
     <pubDate>Mon, 17 Nov 2008 20:06:55 +0300</pubDate>
     <description>Ха, мой сайт без ошибок прошел тесты на всех основных…
     </description>
   </item>
 
 </channel>
 </rss>

Согласно спецификации RSS 2.0 RSS-лента должна содержать всего три обязательных элемента:

title
link
description

Все остальные элементы RSS, коих около двух десятков, являются дополнительными.

В самом начале RSS-ленты перечисленные три элемента используются для описания канала целиком:

title  -  имя RSS канала. Оно может совпадать с названием сайта.
link  -  URL сайта для которого создается лента
description  -  краткое описание канала

Затем эти элементы описывают каждый item (пост блога, новость, статью, отдельный комментарий и пр.):

title  -  заголовок item’а.
link  -  URL на item
description  -  здесь обычно выводится содержимое сообщения

Хорошо также в каждый item вставлять дополнительный элемент <pubDate>, который предназначен для указания даты публикации. Сообщения и новости без дат публикации будут неудобны читателям RSS-ленты.
Здесь я хочу сказать о важной особенности связанной с датами в RSS-лентах. Дело в том, что согласно спецификации все даты в RSS-ленте должны указываться согласно стандарту RFC-822, т. е. в таком формате:

Mon, 17 Nov 2008 20:06:55 +0300

Если в базе данных у вас даты указаны в другом формате, то перед выводом их необходимом преобразовать в формат RFC-822. В моем случае даты и время хранятся в раздельных полях базы данных (date и time), поэтому я их преобразовываю отдельно, а потом "склеиваю вместе". Преобразование осуществляется с помощью стандартной функции strftime, при этом преобразуемые данные должны быть переданы этой функции не в текстовом виде, а в виде "метки времени Unix" для чего задействуется функция strtotime.

Содержимое элемента description каждого item’а выводится с помощью XML-секции CDATA. Это позволяет выводить сообщения в RSS-ленте без ошибок, т. к. HTML-теги указанные в секции CDATA не интерпретируются как теги XML.

Ниже показан полный исходный код скрипта на PHP, который создает RSS-ленту:

 
<?php
// Устанавливаем тип содержимого - XML
header("Content-type: text/xml; charset=windows-1251");
 
echo ‘<?xml version="1.0" encoding="windows-1251"?>’;
?>
 
  <rss version="2.0">
    <channel>
      <title>SKLYAROFF</title>
      <link>http://www.sklyaroff.ru/</link>
      <description>MY BLOG</description>
      <copyright>Copyright (c) Sklyaroff Ivan</copyright>
 
<?php
 
// Подключаемся к базе данных
require_once("connect.php");
 
// Выполняем запрос к таблице
$res = mysql_query("SELECT * FROM MESSAGES ORDER BY date DESC LIMIT 30");
 
while ($data = mysql_fetch_object($res)) {
 
// Преобразуем дату к формату RFC-822   
$date_rfs822 = strftime("%a, %d %b %Y", strtotime($data->date));
$time_rfs822 = strftime("%H:%M:%S %z", strtotime($data->time));
 
// Выводим содержимое item
echo <<<END
      <item>
        <title>$data->topic</title>
        <link>http://www.sklyaroff.ru/comm.php?mess=$data->id</link>
        <pubDate>$date_rfs822 $time_rfs822</pubDate>
        <description><![CDATA[$data->message]]></description>
      </item>
END;
}
 
// Теперь можно закрыть соединение с базой данных
mysql_close();
?>
 
</channel>
</rss>

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

Если вы решите использовать этот PHP-скрипт на своем сайте, то рекомендую еще добавить в блок <head> страниц вашего сайта следующую строку (разумеется, URL ленты замените на свой):
<link rel=”alternate” type=”application/rss+xml” title=”RSS 2.0″ href=”http://www.sklyaroff.ru/rss_mess.php”>
 

Эта строка сообщает браузеру, что на сайте присутствует RSS-лента.

Related posts:

  1. Публикации новостей в форматах RSS и Atom Появление технологий RSS и Atom повлекло за собой новую...
  2. 10 главных ошибок RSS   Сегодня RSS используется очень и очень часто, и все...
No Comments

Start the ball rolling by posting a comment on this article!

Leave a Reply




XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>