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; } ?>