2010-02-14 6 views
5

Actualmente, estoy obteniendo una fuente XML de un sitio remoto y guardando una copia local en mi servidor para analizarla en PHP.Grabar, almacenar en caché y analizar alimentaciones XML remotas, comprobaciones de validación en PHP

El problema es cómo hago para agregar algunos controles en PHP para ver si el archivo feed.xml es válido y si es así, use feed.xml.

Y si no es válido con errores (algunos de los cuales algunas veces el alimentador XML remoto muestra un feed.xml en blanco), ¿sirve una copia de respaldo válida del archivo feed.xml del anterior grab/save?

código agarrar 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); 
?> 

hasta ahora sólo tener esta cargarlo

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

gracias

Respuesta

4

Si no se pricipial que rizo debe escribir directamente en un archivo, a continuación, podría verificar XML antes de volver a escribir su feed.xml local:

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

deslizó totalmente mi mente para hacer eso! gracias :) – p4guru

+0

Hola, vuelvo a visitar este código y parece que no puedo extraer el archivo xml remoto para guardarlo localmente, mientras que el código que publiqué arriba en la primera publicación funciona pero el archivo de guardar xml se corta abruptamente. alguna idea? – p4guru

3

¿Qué tal esto? No es necesario usar curl si solo necesita recuperar 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

gracias Josh definitivamente aprendiendo ... me alegro de haber iniciado sesión en este sitio :) – p4guru

0

En una clase que arme, tengo una función que comprueba si existe el archivo remoto y si está respondiendo de manera oportuna:

/** 
* 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 clase completa contiene código de repliegue a asegúrese de que siempre tengamos algo con lo que trabajar.

Blog post explicando la clase completa está aquí: http://weedygarden.net/2012/04/simple-feed-caching-with-php/

Código está aquí: https://github.com/erunyon/FeedCache

Cuestiones relacionadas