Что такое 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;
// Максимальное количество записей
в ленте
// Загружаем содержимое
$rss_content
=
file($rss_content_file);
// Если записей больше чем нужно,
выкидываем самую старую
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);
// Собираем ленту
$rss_document
=
array_merge(
file($rss_header_file),
file($rss_content_file),
file($rss_footer_file)
);
// Используем временный файл,
чтобы не возникло конфликтов доступа
$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);
Последние комментарии