Comment fusionner une liste de fils RSS en PHP avec le Zend Framework ?

Les N fils RSS sont récupérés puis il sont fusionnés en respectant l'ordre des dates de publications. Ce code est une amélioration de celui trouvé sur le site suivant : http://www.arikfr.com/blog/handling-rss-feeds-in-php-using-zend_feed.html

<?php
require_once 'Zend/Feed.php';
 
function loadFeed ($url) {
    try {
         $feed = Zend_Feed::import($url);
    } catch (Zend_Feed_Exception $e) {
         // feed import failed
         return null;
    }
    return $feed;    
}
function getEntriesAsArray ($feed) {
     $entries = array();
 
     foreach ($feed as $entry) {    
         $date = $entry->pubDate();
         if (!$date) {
            $date = $entry->{'dc:date'};
         }
         $entries[] = array (
             'title' => $entry->title(),
             'link' => $entry->link(),
             'guid' => $entry->guid(),
             'lastUpdate' => strtotime($date),
             'description' => $entry->description(),
             'pubDate' => $date,
             );
     }
 
     return $entries;
}
 
function cmpEntries ($a , $b) {
     $a_time = $a['lastUpdate'];
     $b_time = $b['lastUpdate'];
 
     if ($a_time == $b_time) {
         return 0;
     }
     return ($a_time > $b_time) ? -1 : 1;
}
 
 
// liste de tous vos flux à fusionner
$feed_urls = array('http://www.nexen.net/news/backend.2.rss',
                   'http://www.unixgarden.com/index.php/feed',
                   'http://rss.slashdot.org/Slashdot/slashdot');
 
$feeds = array();
foreach($feed_urls as $k => $url) {
    $feeds[$k] = loadFeed($url);
}
 
$merged_feed = array (
     'title'     => 'Titre de votre flux résultat',
     'link'      => 'http://url-de-votre-flux/',
     'charset'   => 'UTF-8', 
     'entries'   => array(),
);
 
foreach($feeds as $feed) {
    $merged_feed['entries'] = array_merge($merged_feed['entries'], getEntriesAsArray ($feed));
}
 
usort ($merged_feed['entries'], 'cmpEntries');
 
$rssFeedFromArray = Zend_Feed::importArray($merged_feed, 'rss');
$rssFeedFromArray->send();

Discussion

Stéphane GullyStéphane Gully, 2010/06/01 17:25

Si on souhaite éviter de bloquer l'exécution du script lorsqu'un des site est indisponible, il faut attraper l'exception générée par Zend de cette façon :

foreach($feed_urls as $k => $url) {
    try {
        $f = loadFeed($url);
        $feeds[$k] = $f;
    } catch( Exception $e ) {
        trigger_error($e->getMessage());
    }
}
Enter your comment
 
 
 

Recent changes RSS feed Valid XHTML 1.0 Valid CSS Driven by DokuWiki