RSS 2.0 лента на PHP 5

RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами. Обычно с помощью RSS 2.0 даётся краткое описание новой информации, появившейся на сайте, и ссылка на её полную версию. Интернет-ресурс в формате RSS называется RSS-каналом или RSS-лентой или RSS-фидом. Практически все популярные современные браузеры поддерживают RSS каналы: Safari, Maxthon, Mozilla Firefox, Mozilla Thunderbird, Opera, Microsoft Internet Explorer начиная с 7-й версии. Я не буду останавливаться на истории формата, скажу лишь что существуют версии 0.91, 1.0 и 2.0, причем не совместимые между собой. Крайне не рекомендую вам использовать версию 0.91, потому что умная Netscape 5 января 2006 года удалила с сайта my.netscape.com файл rss-0.91.dtd, ссылки на который были размещены в большом количестве трансляций формата RSS версии 0.91. Это событие привело к сбою некоторых онлайновых и офлайновых агрегаторов, так как потоки, ссылающиеся на этот DTD стали невалидными. Мы же рассмотрим самый последний формат на момент написания этой статьи - RSS 2.0.

Пример формата RSS 2.0 и описание тегов

По своей сути RSS напоминает обычный XML файл:

<?xml version="1.0"?> <rss version="2.0"> <channel> <title>My News</title> <link>http://mysite.com/</link> <description>News from my family.</description> <language>en-us</language> <pubDate>Tue, 10 Jun 2006 04:00:00 GMT</pubDate> <lastBuildDate>Tue, 10 Jun 2006 09:41:01 GMT</lastBuildDate> <docs>http://blogs.law.harvard.edu/tech/rss</docs> <generator>Weblog Editor 2.0</generator> <managingEditor>editor@mysite.com</managingEditor> <webMaster>webmaster@mysite.com</webMaster> <item> <title>My Birthday</title> <link>http://mysite.com/blog/2006/mybirthday.php</link> <description>I celebrate my birthday today!</description> <pubDate>Tue, 01 Jun 2006 09:39:21 GMT</pubDate> <guid>http://mysite.com/blog/2006/06/01.html#item1</guid> </item> <item> <title>My new PC</title> <link>http://mysite.com/blog/2006/mynewpc.php</link> <description>I want to buy new PC.</description> <pubDate>Tue, 27 May 2006 08:37:32 GMT</pubDate> <guid>http://mysite.com/blog/2006/05/27.html#item1</guid> </item> </channel> </rss>
Обязательные элементы канала
titleИмя RSS канала. Оно например может совпадать с названием сайта.
descriptionКраткое описание RSS канала.
linkСсылка на сайт, с которым связан канал.
Необязательные элементы канала (channel)
languageЯзык канала (en-us - Английский; ru - Русский).
copyrightСведения об авторстве на RSS канал.
managingEditorEmail адрес ответственного за контент канала.
webMasterEmail адрес ответственного за техническую часть публикации канала.
pubDateДата публикации канала, в соответствии с Date and Time Specification of RFC 822.
lastBuildDateВремя последней модификации канала в соответствии с Date and Time Specification of RFC 822.
categoryОдна или несколько категорий, к которым принадлежит канал.
generatorНазвание программы, использованной для генерирования RSS канала.
docsСсылка на файл документации подвида RSS, который был использован для создания канала.
ttlTtl расшифровывается как ‘time to live’. Это число минут, в течение которых канал сохраняет свою актуальность.
imageИспользуется для подключения графического файла (GIF, JPEG, или PNG), который будет показан вместе с RSS каналом. Имеет следующие параметры:
title - обычно тот же текст, что и в RSS title;
description - описание графического файла, которое будет показано, если файл не доступен;
link - ссылка на страницу, с которой связан канал;
url - URL на файл формата JPEG, GIF или PNG, который связан с RSS каналом;
width - ширина рисунка.
height - высота рисунка.
skipHoursЧисло часов, в течение которых RSS ридеры могут не проверять канал на обновления.
skipDaysЧисло дней, в течение которых RSS ридеры могут не проверять канал на обновления.
Обязательные элементы итема (item)
titleИмя итема (новости, сообщения) RSS канала.
descriptionКраткое описание итема.
linkссылка на страницу, содержащую полное описание события.
Необязательные элементы итема (item)
authorEmail адрес автора сообщения.
categoryКатегория итема.
comments Ссылка на страницу с комментариями по итему.
enclosure Описывает медиа-объект, присоединенный к итему. Имеет следующие параметры:
url - ссылка на файл объекта;
length - размер файла в байтах;
type - тип файла, в соответствии со спецификацией MIME.
guidУникальная строка, используемая для идетификации итема.
pubDateДата публикации итема, в соответствии с Date and Time Specification of RFC 822.

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

Реализация на PHP 5

Я не стал городить классы и шаблоны, а сделал все достаточно просто:

<?php // Задаем формат даты define('DATE_FORMAT_RFC822','r'); // Сообщяем браузеру что передаем XML header("Content-type: text/xml; charset=windows-1251"); // Дата последней сборки фида $lastBuildDate=date(DATE_FORMAT_RFC822); echo <<<END <?xml version="1.0" encoding="windows-1251"?> <rss version="2.0"> <channel> <title>mysite.com RSSFeed</title> <link>http://mysite.com</link> <description>Мой супер блог</description> <pubDate>$lastBuildDate</pubDate> <lastBuildDate>$lastBuildDate</lastBuildDate> <docs>http://blogs.law.harvard.edu/tech/rss</docs> <generator>Weblog Editor 2.0</generator> <copyright>Copyright 2006 mysite.com</copyright> <managingEditor>editor@mysite.com</managingEditor> <webMaster>webmaster@mysite.com</webMaster> <language>ru</language> END; // В этом файле надо разместить подключение к базе данных include_once("db.php"); // Модифицируйте запрос под вашу таблицу $query = "SELECT name, anon, url, UNIX_TIMESTAMP(date) as pubdate FROM news WHERE visible=1 ORDER by date desc LIMIT 0,10"; $res = mysql_query($query); while ($row=mysql_fetch_array($res)) { // Убираем из тайтла html теги и лишние пробелы $title = strip_tags(trim($row['name'])); // С аноносом можно не проводить такие // манипуляции, т.к. мы вставим его в блок CDATA $anon = $row['annonce']; $url = $row['uri']; $pubDate = date(DATE_FORMAT_RFC822, $row['pubdate']); echo <<<END <item> <title>$title</title> <description><![CDATA[$anon]]></description> <link>http://mysite.com/news/$url</link> <guid isPermaLink="true">http://mysite.com/news/$url</guid> <pubDate>$pubDate</pubDate> </item> END; } echo <<<END </channel> </rss> END; ?>

Как видите все получилось довольно просто. Чтобы увидеть результат можно просто ввести в браузере Opera 9 адрес фида: http://mysite.com/rssfeed.php. Также можно сообщить браузеру о существовании фида, добавив в блок <head> страниц вашего сайта строку:
<link rel="alternate" type="application/rss+xml" title="RSS" href="http://mysite.com/rssfeed.php" />

Теги:
Поделись с друзьями:
Комментарии

Спасибо за статью! Я теперь сделал у себя в блоге RSS ленту, только возник вопрос: как вы сделали отображение количества комментариев в фиде через FeedBurner?

Спасибо за отличную статью. Всегда обращаюсь к ней если забываю те или иные теги RSS-канала.

На моём форуме есть закрытые разделы. Делаю RSS постов форума. Как сделать авторизацию по RSS? Чтобы ленту могли смотреть только те, кто имеет доступ в закрытые разделы? В RSS-ридерах есть поля Логин и Пароль, непонятно только, КАК они их передают скрипту.

Очень помогла статья - у меня была ошибка с выводом даты в Яндекс-Виджете. Спасибо.