1. Введение
О том, как RSS может помочь продвижению – можно почитать
«Для начала, определимся с тем, что такое RSS. Кратко, RSS – это формат синдикации web-контента. Это обычный формат представления данных, основанный на языке XML. Первоначально этот формат был разработан специально для экспорта заголовков новостей. Однако область его применения может выходить далеко за рамки этой задачи. Вы с легкостью можете экспортировать любую информацию, любые материалы. Формат примечателен тем, что дает единство представления данных. Любая информация, оформленная в RSS должна соответствовать определенной структуре... Благодаря такой формализации, конечный пользователь получает информацию в стандартизированном виде, что упрощает чтение и работу с ней. Именно удобством работы и объясняется растущий интерес к этому формату и его всё большая популяризация».
(
Подробнее о том, что такое RSS можно почитать здесь (
В начале данного мастер-класса я покажу, как можно внедрить RSS непосредственно на страницу (здесь будут рассмотрены способы подключения RSS только при помощи php). Затем – некоторые способы оптимизации работы с RSS. В заключении я расскажу о некоторых проблемах RSS и способах их решения.
2. Как подключить RSS
RSS - данные, представленные в виде xml определенной структуры. Общий принцип подключения RSS можно представить следующим образом:
3. Способы получения RSS при помощи php
1. Cокетами
Пусть URL RSS = https://m.seonews.ru/rss/ (для всех остальных примеров).
Код получения rss новости будет примерно следующим:
< ?
$out = '';
$fp = fsockopen("m.seonews.ru", 80, $errno, $errstr, 1);
if ($fp) {
$out = "GET /rss/ HTTP/1.1 ";
$out .= "Host: m.seonews.ru ";
$out .= "Connection: Close ";
fwrite($fp, $out);
$out = '';
while (!feof($fp)) {
$out .= fgets($fp, 128);
}
fclose($fp);
}
?>
Плюсы – Работает на всех версиях php, не требует дополнительных модулей.
Минусы – громоздкий код.
Возможные проблемы:
Одна из главных проблем – то, что контент скачивается с другого хоста. Соответственно, время загрузки основной страницы увеличивается на время загрузки RSS. Может быть такое, что канал будет забит, или сервер с новостью будет недоступен. Поэтому нужно ограничить время получения rss новости. Первое ограничение уже было сделано: последний параметр функции fsockopen установлен в 1 – это значит, что сокет будет открываться не дольше секунды, в случае неудачи переменная $out вернет пустую строку. Но есть еще одно «но»: сокет может открыться быстро, а данные будут скачиваться долго. Чтобы этого не произошло, перепишем код следующим образом:
< ?
$out= '';
$fp = fsockopen("m.seonews.ru", 80, $errno, $errstr, 1);
if ($fp) {
$time = time();
stream_set_timeout($fp, 1);
$out = "GET /rss/ HTTP/1.1 ";
$out .= "Host: m.seonews.ru ";
$out .= "Connection: Close ";
fwrite($fp, $out);
$out = '';
while (!feof($fp)) {
$out .= fgets($fp, 128);
if (time() - $time > 2) {
$out = '';
break;
}
}
fclose($fp);
}
?>
Таким образом, в самом плохом случае задержка загрузки страницы из-за RSS не будет превышать 3 секунд: 1 секунда на открытие сокета и 2 секунды на получение данных. Функция stream_set_timeout($fp, 1); устанавливает максимальное время чтения из потока, а временем мы контролируем, чтобы вовремя выйти из цикла чтения из сокета данных.
О том, что делать, если данные не пришли – см. далее.
2. Curl
Это библиотека, которая позволяет взаимодействовать с различными серверами по различным протоколам.
Код с контролем времени будет выглядеть примерно следующим образом:
< ?
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://m.seonews.ru/rss/");
// вернуть значение а не вывести на страницу
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
// чтобы заголовок не входил в контент
curl_setopt($ch, CURLOPT_HEADER, 0);
// ограничение по времени получения
// (сюда уже входит и время открытия соединения
// и время получения данных)
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$out = curl_exec($ch);
curl_close($ch);
?>
Плюсы – достаточно компактный код, с возможностью быстрой модификации.
Минусы – необходимо наличие установленного расширения для php и библиотеки curl, а также версия php не ниже 4.0.2
3. Другие способы
PHP позволяет получить данные из сети и другими способами, например, при помощи include с перехватом буфера содержимого или file_get_contents. Но управлять временем получения данных будет не так просто, как в описанных выше случаях.
4. Способы обработки xml
После того как мы получили данные, их необходимо обработать. Данные RSS хранятся в xml файле определенной структуры. Поэтому чтобы вписать ленту в дизайн сайта, а также избавится от ненужной информации, данные необходимо обработать.
Для начала – общая структура RSS. Упрощенно, структура RSS-файла выглядит так:
< ?xml version="1.0" encoding="UTF-8" ?>
< title >
< link>
< description>
< title >
< title >
< link>
< description>
/item>
. . .
/channel
Подробнее см., например,
1. xslt
Так как RSS – это xml, можно использовать xslt преобразование. Пусть у нас в переменной $out содержится полученная rss лента новостей в виде xml.
Пусть xslt шаблон находится в файле rss_temp.xsl, и содержит код, приведенный ниже:
< ?xml version="1.0" encoding="utf-8" ?>
< xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
< xsl:output method="html" />
< xsl:template match="rss/channel">
Чтобы использовать данное преобразование, можно воспользоваться следующим кодом:
< ?
$result="";
$xslt = xslt_create();
$result = xslt_process($xslt, "arg:/_xml", "arg:/_xsl", NULL, array('/_xml' => $out, '/_xsl' => file_get_contents('rss_temp.xsl')));
xslt_free($xslt);
?>
В результате, в переменной $result будет содержаться готовый для вставки кусок кода.
Плюсы – достаточно поменять шаблон, чтобы получить новый вид отображения ленты; достаточно гибкая технология.
Минусы – необходимо наличие модуля и библиотек xslt преобразования (sablotron для 4 версии php). Для пятой версии php код будет выглядеть иначе, т.к в пятой версии используется другая библиотека xslt преобразований: libxslt. Как вариант решения данной проблемы – можно использовать код, описанный в статье
2. Другие способы
В интернете можно найти достаточно большое количество готового кода для обработки RSS и адаптировать под свои нужды, например,
5. Оптимизация работы с RSS
Одна из проблем RSS, как было сказано выше, - это то, что они находятся на других серверах. Если у вашего сайта большая посещаемость, то для каждого пользователя, зашедшего на сайт, нужно повторно вытаскивать одинаковую информацию из интернета, что забивает канал и уменьшает скорость работы сервера, а вследствии – скорость загрузки страницы. У каждой ленты есть период обновления. Поэтому приходит мысль использовать одни и те же данные повторно, то есть – кэшировать. К тому же технология xslt, например – достаточно ресурсоемкая и каждый раз использовать преобразование – это также может повлиять на скорость работы сайта.
Первый способ – это полученный результат сохранять в файле, и проверять время модификации этого файла. Если разница между текущем временем и временем модификации файла превышает заданный интервал (например, час), то попытаться снова получить данные и после обработки – переписать файл.
< ?
// Это добавить перед получением и обработкой rss
$rss_cache = 'rss_cashe.inc';
// если нет файла или время последнего изменения файла > 3600 с (1ч),
// то получить и обработать rss
if (!file_exists($rss_cache) (time() - filemtime()) > 3600) {
// код получения и обработки rss,
// на выходе – переменная с готовым для
// отображения содержанием ($result)
...
// запишем в кэш
$f = fopen($rss_cache, 'wt');
fwrite($f, $result);
fclose($f)
} else {
$result = file_get_contents($rss_cache);
}
?>
Второй способ – это обрабатывать новости сторонним скриптом, который запускается, например, по crontab, а результат сохранять в файле. На страницу импортировать уже готовый файл.
< ?
// предполагаем, Что скрипт лежит там-же, Где лежит страница, которая будет забирать новость.
$rss_cache = dirname(__FILE__) . '/rss_cashe.inc';
// если нет файла или время последнего изменения файла > 3600 с (1ч),
// то получить и обработать rss
if (!file_exists($rss_cache) (time() - filemtime()) > 3600) {
// код получения и обработки rss,
...
// запишем в кэш
$f = fopen($rss_cache, 'wt');
fwrite($f, $result);
fclose($f)
}
?>
Этот скрипт следует поместить в файл, который будет запускаться по crontab или еще какому-либо планировщику. А на странице только в нужном месте указать:
< ?
$rss_cache = 'rss_cashe.inc';
include($rss_cache);
?>
7. Заключение
Данный мастер-класс показывает лишь некоторые способы использования и обработки RSS при помощи php. Более подробную информацию можно получить из указанных источников. Код, который расположен на внешних источниках, приведен в качестве примера, его работоспособность проверена лишь частично. Код, используемый в данной статье проверен, но все мы можем ошибаться. Поэтому, при обнаружении неточностей, или неработоспособности кода – просьба сообщить автору мастер-класса.