PHP5 - Parser du xml avec un timeout ( simplexml_load_string , curl , timeout )

Lorsque l'on charge un fichier (via file_get_contents par exemple) afin d'en parser le contenu, il se peut que l'url distante mette du temps à se charger, et du coup, provoque un ralentissement de vos scripts. Ce cas de figure s'est présenté à moi en utilisant la régie publicitaire clickintext (qui propose ses publicités sous forme de flux rss). Nous allons d'une part utiliser Curl, et d'autre part charger notre xml avec simplexm_load_string.
<?php
$url = "http://url_de_votre_flux";
$ch = curl_init();
$timeout = 5; // mettre zero pour aucun timeout
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$result = curl_exec($ch);
curl_close($ch);
$rss = simplexml_load_string($result);
?>

Il suffit donc de paramètrer la variable $timeout afin de spécifier un timeout plus ou moins élevé, empêchant curl de tenter durant des heures de charger une url qui lagge. Pour parser et parcourcir l'élément $rss que vous venez de créer, une simple boucle foreach suffit.
Partons d'un rss de type :
<channel>
<item>
<title>Titre</title>
<url>http://url</url>
<img>http://url</img>
</item>
</channel>

Pour récupèrer le titre du premier item :$titre = $rss->channel->item[0]->$titre.
$rss->channel correspond à toutes les entrées comprises entre channel et channel.$rss->channel->item[0] correspond à toutes les entrées comprises dans le premier élément ( car "0" ) item de channel

Pour parcourir de cette manière tous les items du flux :
<?php
foreach($rss->channel->item as $item){
$titre = $item->titre;
$url = $item->url;
$img = $item->img;
}

?>

 



Gpenverne

Gpenverne

Développeur backend symfonien, qui trouve toujours moyen de faire des machins avec des bidules même si ce n'est pas utile.

Read More