Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

Lire un flux rss avec PHP et simple XML

Article posté le 21-11-2013 dans la catégorie PHP

Voici une petite application de code pour lire un flux rss, avec quelques conseils d'applications. 

Partons du principe qu'un flux rss n'est ni plus ni moins qu'un fichier xml, et qu'il existe une libraire toute faite pour traiter cela avec PHP.

1- Juste lire et stocker les infos

Voici un code tout simple pour lire le flux d'un site. On utilise la fonction simplexml_load_file().

Ensuite, on a juste à choisir les champs qui nous intéresse, ici en l'occurence "Title" et "Link" qui seront mes balises Ancre et href quand j'afficherais les liens vers les articles en question.

Je mets tout cela dans une boucle for, pour pouvoir récuperer un nombre d'articles défini ($Nombre), et également réduire la taille de leur titre (substr). Je stocke tout cela dans un tableau que l'intégrateur HTML utilisera pour mettre en forme les liens comme bon lui semble.

$urlFeed = "http://www.mon-wordpress.com/forum/feed/";
        $rss = simplexml_load_file($urlFeed);
        $tableauInfos=null;
    
        for($leCompteur=0; $leCompteur<$Nombre; $leCompteur++)
        {
            $tableauInfos[$leCompteur]['Url'] =  $rss->channel->item[$leCompteur]->link;
            $tableauInfos[$leCompteur]['Ancre'] =  substr($rss->channel->item[$leCompteur]->title, 0, $longueurMax-3);
        }
        return($tableauInfos);

2- Oui mais, si ca foire...

Il faut donc se protéger, ou plutôt afficher un message d'erreur plus "user friendly" qu'un message d'avertissement en anglais qui pourrait défigurer le site au passage.

Pour cela on définit la fonction exceptions_error_handler qui permet de convertir les erreurs en exceptions, puis on l'appelle, et on met notre code dans un try catch afin de gérer l'erreur soit-même. Le message ici ("Oups... On a un problème : impossible de lire le flux")

function exceptions_error_handler($severity, $message, $filename, $lineno) //Permet de convertir les warnings et erreurs en exception
{
  if (error_reporting() == 0) 
  {
    return;
  }
  if (error_reporting() & $severity) 
  {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
  }
}

 

function donneMoiLesTitres($Nombre, $longueurMax)
{
    set_error_handler('exceptions_error_handler'); //conversion
    try
    {
        $urlFeed = "http://www.monsite/feed/";
        $rss = simplexml_load_file($urlFeed);
        $tableauInfos=null;
    
        for($leCompteur=0; $leCompteur<$Nombre; $leCompteur++)
        {
            $tableauInfos[$leCompteur]['Url'] =  $rss->channel->item[$leCompteur]->link;
            $tableauInfos[$leCompteur]['Ancre'] =  substr($rss->channel->item[$leCompteur]->title, 0, $longueurMax-3);
        }
        return($tableauInfos);
    }
    catch (Exception $e)
    {
        echo( 'Oups... On a un problème : impossible de lire le flux');
    } 
}

3- Ajax pour la tranquilité

Cependant, lire un flux rss externe peut être parfois un peu long, et ralentir considérablement le chargement de la page, temps qui entre aujourd'hui dans les critères de qualité SEO de Google.

Pour éviter cela, vous pouvez sous traiter l'affichage du flux rss à une requête Ajax avec JQuery (par exemple). 

De cette façon, JQuery, via un script que vous aurez paramétré pour qu'il ne s'éxecute qu'une fois la page chargé, s'occupera de lire et afficher les articles. Ainsi, le petit délai nécessaire à l'affichage des articles, sera à peine (voir pas du tout) perceptible par l'utilisateur, et sans ralentir le temps de chargement.

Tout d'abord, paramétrons notre code PHP, en prévoyant un cas de figure d'une demande avec des paramètre GET :

if(isset($_GET['GO'])&& $_GET['GO']=="GO") //Pour appeler l'affichage depuis une requête Ajax, sans include, pour la partie questions du header
{
    $lesArticles = donneMoiLesTitres($_GET['NOMBRE'], $_GET['LONGUEUR']); // 5 = nombres de lignes souhaitées, 75 = taille maximum de chaque ligne
    if($lesArticles!=null)
    {
        echo '<ul>';
        for($x=0; isset($lesArticles[$x]['Url']); $x++)
        {
            echo '<li><a title="'.$lesArticles[$x]['Ancre'].'" href="'.$lesArticles[$x]['Url'].'">'.$lesArticles[$x]['Ancre'].'</a></li>';
        }
        echo '</ul>';
    }
}

 Ensuite, côté JQuery, quand le chargement est fini, on appelle notre page avec ses paramètres GET, on affiche le résultat qu'elle nous retourne, on précise un timeout (délai maximal), et on prévoit aussi un message d'erreur :

jQuery(document).ready(function()
{
    $.ajax
    ({
        type: 'GET',
        url: "./derniersArticlesForum.php?GO=GO&NOMBRE=5&LONGUEUR=75",
        success: function(data) 
        {
            $('#forum_list').prepend(data); // Permet d'afficher le résultat dans la div ayant pour id "forum_list
​"
        }
        ,
                error: function(jqXHR, textStatus, errorThrown) 
        {
            //alert("Problème de communication avec le Serveur");
            $('#forum_list').prepend("Impossible de lire le flux");
        }
        , timeout: 5000 
     });   
});

Tweet
comments powered by Disqus