Что такое 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);

Все файлы для ленты находятся в папке rss. Полезно также положить туда индексный файл, переадресующий нас на export.xml. В файлах header.inc и footer.inc содержатся, соответственно, заголовок и, хм... завершитель ленты. Можно, конечно, было прописывать их в коде явно, но тогда теряется возможность править их без залезания в код. Да, и не забудьте отформатировать добавляемый текст должным образом, например, с помощью htmlspecialchars(nl2br()).
Information
  • Posted on 27.04.2013 16:15
  • Просмотры: 247