RSS генератор

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




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка