2010-02-14 15 views
5

Attualmente, sto acquisendo il feed XML di un sito remoto e salvando una copia locale sul mio server per essere analizzata in PHP.Grab, cache e analisi feed XML remoto, controlli di convalida in PHP

Problema è come procedere aggiungendo alcuni controlli in PHP per vedere se il file feed.xml è valido e in tal caso utilizzare feed.xml.

E se invalido con errori (di cui a volte il feed XML remoto è visualizzato vuoto feed.xml), serve una copia valida di backup del feed.xml dalla precedente presa/salvataggio?

codice afferrando feed.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); 
?> 

finora hanno solo questo per caricarlo

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

grazie

risposta

4

Se non è pricipial che ricciolo dovrebbe scrivere direttamente in un file, allora si potrebbe controllare XML prima di riscrivere il feed locale.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

completamente passato di mente di farlo! grazie :) – p4guru

+0

Ciao rivisitando questo codice di nuovo e sembra che io non sia in grado di estrarre il remoto xml per salvarlo localmente mentre il codice che ho postato sopra nel primo post funziona ma il file di salvataggio xml è tagliato bruscamente breve? qualche idea? – p4guru

3

Che ne dici di questo? Non c'è bisogno di usare curl se hai solo bisogno di recuperare un documento.

$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

grazie Josh sicuramente imparando .. felice di aver firmato su questo sito :) – p4guru

0

In una classe ho messo insieme, ho una funzione che controlla se è presente il file remoto e se è di rispondere in modo tempestivo:

/** 
* 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 completo contiene il codice di ripiego per assicurati di avere sempre qualcosa con cui lavorare.

blog post che spiega la classe completo è qui: http://weedygarden.net/2012/04/simple-feed-caching-with-php/

Codice è qui: https://github.com/erunyon/FeedCache