« Чуть-чуть про мускул в PHP. | SMS-уведомления о почте в Gmail » |
Получение и разбор RSS в PHP
В основном себе на заметку. Если надо получить данные из ленты новостей, а под рукой внезапно имеются PHP с CURL и SimpleXML, то все как-то на удивление просто. CURL'ом вытягием саму ленту (CURL'ом, потому что за включенный allow_url_fopen в приличных местах гоняют ссаными тряпками), скармливаем полученное SimpleXML'у и получаем объект с разложенными данными. Выглядит это примерно так:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
$headers = array( 'Expect:','Connection: Keep-Alive','Accept-Charset: utf-8,windows-1251;q=0.7,*;q=0.7' );
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, 'http://company.yandex.ru/press_releases/news.rss'); // Адрес RSS
$rss_str = curl_exec($ch);
if(!$rss_str) {
print "Oooops. Can't get rss stream.\n";
exit;
}
$rss = simplexml_load_string($rss_str, 'SimpleXMLElement', LIBXML_NOCDATA);
//print_r ($rss);
foreach ($rss->channel->item as $item) {
print $item->link." (".$item->pubDate.")\n".$item->title."\n".$item->description."\n-----\n";
}
?>
Собственно, что тут:
- Сперва дежурная инициализация CURL. По возможности получать контент в сжатом виде, не делать лишних запросов (пустой заголовок 'Expect:'), устанавливать Keep-Alive соединение. Из-за последнего пункта не видно "curl_close($ch);". Он должен быть где-то позже - вдруг нужно сходить на тот же сервер за подробностями, а соединение-то уже установлено. Если не требуется, закрывать можно сразу после curl_exec.
- Полученное в предыдущем пункте отдается на разгребание SimpleXML'у. Если хочется посмотреть что из этого получается, можно убрать комментарий со следующего за ним print_r и насладиться.
- Ну и дальше, собственно, обработка полученных результатов.