2010-02-14 11 views
5

Actuellement, je saisis le flux XML d'un site distant et enregistre une copie locale sur mon serveur pour être analysée en PHP.Récupération, mise en cache et analyse du flux XML distant, vérification de la validité dans PHP

Le problème est de savoir comment ajouter quelques vérifications en PHP pour voir si le fichier feed.xml est valide et si c'est le cas, utilisez feed.xml.

Et s'il n'est pas valide avec des erreurs (dont le flux XML distant affiche parfois le fichier feed.xml vide), servez-vous d'une copie de sauvegarde valide du fichier feed.xml du précédent grab/save?

Code saisissant flux.xml

<?php 
/** 
* Initialize the cURL session 
*/ 
$ch = curl_init(); 
/** 
* Set the URL of the page or file to download. 
*/ 
curl_setopt($ch, CURLOPT_URL, 
'http://domain.com/feed.xml'); 
/** 
* Create a new file 
*/ 
$fp = fopen('feed.xml', 'w'); 
/** 
* Ask cURL to write the contents to a file 
*/ 
curl_setopt($ch, CURLOPT_FILE, $fp); 
/** 
* Execute the cURL session 
*/ 
curl_exec ($ch); 
/** 
* Close cURL session and file 
*/ 
curl_close ($ch); 
fclose($fp); 
?> 

ont jusqu'à présent seulement cela pour le charger

$xml = @simplexml_load_file('feed.xml') or die("feed not loading"); 

grâce

Répondre

4

Si ce n'est pas pricipial que boucle devrait écrire directement dans le fichier, vous pourrait vérifier XML avant de réécrire votre flux local.xml:

<?php 
/** 
* Initialize the cURL session 
*/ 
$ch = curl_init(); 
/** 
* Set the URL of the page or file to download. 
*/ 
curl_setopt($ch, CURLOPT_URL, 'http://domain.com/feed.xml'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$xml = curl_exec ($ch); 
curl_close ($ch); 
if (@simplexml_load_string($xml)) { 
    /** 
    * Create a new file 
    */ 
    $fp = fopen('feed.xml', 'w'); 
    fwrite($fp, $xml); 
    fclose($fp); 
} 

?> 
+0

totalement glissé mon esprit pour le faire! Merci :) – p4guru

+0

Salut revoir ce code et il semble que je ne suis pas en mesure de tirer le xml distant pour enregistrer localement alors que le code que j'ai posté ci-dessus dans le premier post fonctionne mais le fichier save xml est coupé abruptement court? des idées? – p4guru

3

Que pensez-vous de cela? Pas besoin d'utiliser curl si vous avez juste besoin de récupérer un document.

Dans une classe, je mets ensemble
$feed = simplexml_load_file('http://domain.com/feed.xml'); 

if ($feed) 
{ 
    // $feed is valid, save it 
    $feed->asXML('feed.xml'); 
} 
elseif (file_exists('feed.xml')) 
{ 
    // $feed is not valid, grab the last backup 
    $feed = simplexml_load_file('feed.xml'); 
} 
else 
{ 
    die('No available feed'); 
} 
+0

merci Josh définitivement d'apprentissage .. content d'avoir signé sur ce site :) – p4guru

0

, j'ai une fonction qui vérifie si le fichier distant existe et si elle est de répondre en temps opportun:

/** 
* Check to see if remote feed exists and responding in a timely manner 
*/ 
private function remote_file_exists($url) { 
    $ret = false; 
    $ch = curl_init($url); 

    curl_setopt($ch, CURLOPT_NOBODY, true); // check the connection; return no content 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); // timeout after 1 second 
    curl_setopt($ch, CURLOPT_TIMEOUT, 2); // The maximum number of seconds to allow cURL functions to execute. 
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; da; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11'); 

    // do request 
    $result = curl_exec($ch); 

    // if request is successful 
    if ($result === true) { 
    $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    if ($statusCode === 200) { 
     $ret = true; 
    } 
    } 
    curl_close($ch); 

    return $ret; 
} 

La classe complète contient un code-retour de l'automne à assurez-vous que nous avons toujours quelque chose à travailler avec.

Blog post expliquant la classe complète est ici: http://weedygarden.net/2012/04/simple-feed-caching-with-php/

code

est ici: https://github.com/erunyon/FeedCache