Попросил меня один очень хороший знакомый написать сценарий, позволяющий публиковать на главной странице его сайта компьютерные новости с сайта 3DNews.ru. При этом он высказал мне следующее пожелание – новости должны автоматически скачиваться с сайта донора и сохраняться на локальном сервере, дабы не замедлять загрузку страницы при каждом обращении к ней. К тому же обновление новостей должно происходить примерно 2 раза в сутки. И на последок – достаточно публиковать только 5 новостей из всего, что предлагает 3DNews.ru.
И не то, что это было бы сложно сделать, но уж совсем времени свободного на такое жалко. А поскольку знакомый очень уж хороший, то решился я все же ему помочь, однако выбрал самый короткий путь к цели. В результате скрипт написался практически сам собой минут за 15-20.
Судите сами. Для приготовления такого блюда в кратчайшие сроки необходимо иметь следующие ингредиенты:
1. Адрес RSS-канала новостей (это была, кстати, самая сложная задача, так как на самом сайте 3DNews.ru этот адрес не так то и легко было отыскать)
2. PHP5 под управлением сервера Apache
3. Самый простой инструмент для работы с XML – модуль PHP SimpleXML (в PHP5 входит по умолчанию, о чем многие и не догадываются), удачно написанный в свое время замечательным программистом и превосходным человеком Стерлингом Хьюзом, кстати, если встретите его книгу о PHP, обязательно прикупите – очень советую.
Почему именно PHP5? Ну, во-первых, из-за SimpleXML. Во-вторых, чтобы не очень возиться с файлами при чтении и записи, так как в пятерке PHP есть замечательные функции, которые позволяют выполнять стандартные операции с файлами за один оператор кода (например, file_put_contents()).
Что получилось в результате – предлагаю ознакомиться с полным кодом сценария.
// Трансляция новостей с 3DNews.ru
// http://www.3dnews.ru/news/rss/
// Имя файла для хранения RSS на локальном сервере
$filename = 'rss/3dnews.xml';
// URL RSS потока
$rss_url = 'http://www.3dnews.ru/news/rss/';
// Закачка файлов XML
// Произвести проверку на то, что файл уже закачен
if (!file_exists($filename)) {
// Закачать и сохранить
download($rss_url, $filename);
}
// Создание объекта SIMPLEXML и загрузка документа
$xml = simplexml_load_file($filename);
$i = 1;
foreach ($xml->channel->item as $item) {
$title = $item->title;
$description = $item->description;
$link = $item->link;
echo iconv("UTF-8", "windows-1251", $title);
echo iconv("UTF-8","windows-1251", $description);
echo $link;
$i++;
if ($i > 5) break; // Не более 5 анонсов новостей
}
// Проверка на то, что если файл устарел более, чем на 12 часов - качать и сохранить новый
if (time() > filemtime($filename) + 60*60*12) {
// Закачать и сохранить
download($rss_url, $filename);
}
############################################################################
function download($url, $filename) {
// Закачать файл с указанного URL и сохранить с определенным именем
$file = file_get_contents($url);
if ($file) file_put_contents($filename, $file);
}
И главное – не более 15 минут на все : )
Примечание. Будите использовать этот код – убедитесь, что папка rss, которую я указал для хранения xml-документа новостей, имеет права на запись в нее PHP-сценарием.
А информацию о том, что представляет из себя SimpleXML, можно почитать на сайте PHP.
А не проще из RSS делать HTML представление с помощью XSLT? В этом случае можно легко и без изменения кода менять внешний вид получаемых новостей? Да и быстро это... :)
Ответить
31.01.2007
То же вариант. Только, учитывая задачу кэширования, все равно пришлось бы php подключать. А к тому же нужно было бы подключать расширение XSL.
Ответить
01.02.2007