Что такое RSS? Если коротко, то это формат обмена контентом, базирующийся на XML. Любой интернет-ресурс, содержащий обновляемый или пополняемый контент, может заиметь у себя RSS ленту, и тогда пользователи этого ресурса получат быстрый и удобный способ получить свежие материалы. Кстати, показывать RSS в удобочитаемом виде может та же Opera, а вот IE выдаёт просто отформатированный XML файл.
Итак, задача: написать простой генератор RSS ленты для сайта, содержащего часто пополняемый контент. Решение пишем на PHP. А вы как думали? :) Записи ленты будем хранить в отдельном файле, чтобы было легче выкидывать устаревшие. Кто это предложил «генерировать ленту динамически, выбирая самые свежие записи из MySQL»? Не прокатит, учитывая, что обращаться к базе данных и делать выборку нам придётся каждый раз при просмотре ленты пользователем. В нашем же варианте мы имеем простое кэширование, и регенерация RSS происходит лишь в момент добавления новой записи, причём вообще без обращения к базе.
Схема проста: подгружаем файл с лентой, обрезаем старую запись, если их слишком много, и дописываем новую. Вот кусок кода, пояснения по ходу:
$rss_header_file = rss/header.inc; $rss_content_file = rss/content.inc; $rss_footer_file = rss/footer.inc; $rss_document_file = rss/export.xml; $rss_temp_file = rss/tempfile; $rss_miss_lines = 8; // Количество строк в одной записи $rss_max_records = 10; // Максимальное количество записей в ленте
// Если записей больше чем нужно, выкидываем самую старую if (count($rss_content) > $rss_miss_lines * $rss_max_records) $rss_content = array_slice($rss_content, $rss_miss_lines);
// Добавляем свежую запись // В соответствующих переменных должны содержаться данные // При добавлении/удалении полей поправить $rss_miss_lines array_push( $rss_content, <item>\n, <title>.$author.</title>\n, <link>.$link.</link>\n, <guid>.$link.</guid>\n, <description>.$message.</description>\n, <pubDate>.date(r).</pubDate>\n, <author>.$author.</author>\n, </item>\n ); $fp = fopen($rss_content_file, w); foreach($rss_content as $rss_content_line) { if ($rss_content_line != \n) fwrite($fp, $rss_content_line); } fclose($fp);
// Используем временный файл, чтобы не возникло конфликтов доступа $rnd = rand(0, 1000); $rss_temp_file = $rss_temp_file.$rnd; $fp = fopen($rss_temp_file, w); foreach($rss_document as $rss_document_line) fwrite($fp, $rss_document_line); fclose($fp); unlink($rss_document_file); rename($rss_temp_file, $rss_document_file);
Все файлы для ленты находятся в папке rss. Полезно также положить туда индексный файл, переадресующий нас на export.xml. В файлах header.inc и footer.inc содержатся, соответственно, заголовок и, хм... завершитель ленты. Можно, конечно, было прописывать их в коде явно, но тогда теряется возможность править их без залезания в код. Да, и не забудьте отформатировать добавляемый текст должным образом, например, с помощью htmlspecialchars(nl2br()).