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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top