Отримання RSS
Основою буде мій улюблений інструмент – Zend Framework (використовуємо останню, trunk версію). Якщо ви знайомі з його можливостями, що відразу запропонуйте компонент Zend_Feed, який має вбудовані можливості для вилучення зі сторінки стрічок. Однак не поспішайте, на практиці завдання не таке й просте. Тому вирішуватимемо її поступово.
Нормалізація URL.
Отримання прямих лінків на стрічки.
- $cache = Zend_Cache::factory( 'Core' ,
- 'File',
- array(
- 'lifetime' => 24*3600,
- 'automatic_serialization' => true ,
- 'caching' => true ,
- 'cache_id_prefix' => 'preview_feed_',
- 'write_control' => true ,
- 'ignore_user_abort' => true
- ),
- array(
- 'read_control_type' => 'adler32',
- 'cache_dir' => '/tmp/cache'
- ));
- Zend_Feed_Reader::setCache($cache);
- Zend_Feed_Reader::useHttpConditionalGet( true );
Наприклад, візьмемо навмання наступний список:
- $_url = array(
- 'http://www.cnbc.com/id/19789731/device/rss/rss.xml' ,
- 'http://www.planet-php.net/',
- 'ajaxian.com' ,
- 'http://twitter.com/abrdev',
- 'http://verens.com/archives/2009/12/28/multiple-file-uploads-using-html5/');
Далі пропустимо його через валідатор, описаний вище і отримаємо повний масив URL.
- //масив лінків, які готові до обробки (валідні URI)
- $_links = Array();
- echo "Checking URL. " ;
- foreach ($_url as $u)
- echo "Original URL:" . $u . ". ";
- $_url = self::_val >if ($_url === false ) continue ;
- else
- $_links[] = $_url;
- >
- foreach ($_links as $fl)
- //пробуємо вийняти URL із зазначеного сайту
- try
- $_lhttp = Zend_Uri_Http::fromString($fl);
- if ($_lhttp->val >//перевіримо та отримаємо ім'я сайту
- $site = $_lhttp->getHost();
- $_feeds_links[$site] = Array();
- >
- else
- // якщо не вийшло перевірити, пропускаємо
- continue;
- >
- catch (Zend_Uri_Exception $e)
Зверніть увагу, якщо ми намагаємося завантажити фід безпосередньо, ми не знаємо, який формат буде, тому для перевірки результату використовуємо той факт, що всі класи фідів мають спільного предка, абстрактний клас Zend_Feed_Reader_FeedAbstract. Також у цьому випадку буде деяке дублювання, тому що далі ми отримуватимемо останні записи з фідів. Але оскільки ми використовуємо кешування, для випадку прямих посилань дані вже будуть у кеші, тому повторного запиту не буде.
Отримання останніх записів стрічки.
Якщо на цьому етапі ми зустрінемося з помилкою, то просто пропускаємо стрічку — у кращому разі, на сторінці буде ще одна стрічка, але іншого формату, у найгіршому — ми нічого не знайдемо. Коли стрічка імпортована, ми отримаємо заголовок, а далі в циклі 10 останніх записів, для кожного з яких отримаємо посилання, назву та дату створення (дата завжди йде до GMT). У тестовому прикладі я відразу формую рядок, в реальності швидше за все ви кожен з компонентів збережете окремо, а час, можливо, приведете до єдиногостандарту (наприклад, з урахуванням поточної локалі користувача) та конвертуєте в UNIX TIMESTAMP для зручності обробки.
Retriving last feed items. ';
Результат ми поки що просто виводимо через var_dump в браузер (адже це лише тестовий скрипт). У реальній системі всі ці дані пакуються в JSON-масив і відправляються клієнту, який відображає користувачеві та дає можливість вибрати одну зі стрічок для передплати. Звичайно, можна було б зробити все за користувача - наприклад, вУ випадку кількох стрічок, які відрізняються лише форматом, перевіряти збіг ID новин, і якщо вони однакові, то просто брати кращий формат і все. Але це залежить від специфіки конкретних завдань.
Хардкорна конфа за С++. Ми запрошуємо лише профі.