Grab, caché y analizar el feed XML remoto, comprobaciones de validación en PHP
-
20-09-2019 - |
Pregunta
Actualmente, estoy agarrando XML feed de un sitio remoto y guardar una copia local en mi servidor para ser analizada en PHP.
El problema es cómo hago para añadir algunas comprobaciones en PHP para ver si el archivo feed.xml es válida y si es así feed.xml uso.
Y si no es válido con errores (de los cuales a veces la alimentación remoto XML somes visualizar feed.xml en blanco), entregar una copia válida de copia de seguridad de la feed.xml de apropiación anterior / guardar?
código feed.xml acaparamiento
<?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
Solución
Si no se pricipial que rizo debe escribir directamente en un archivo, a continuación, se puede comprobar XML antes de volver a escribir su feed.xml locales:
<?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);
}
?>
Otros consejos
¿Qué tal esto? No es necesario utilizar rizo si sólo tiene que 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');
}
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 para asegurarse de que siempre tenemos algo con 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