2010-12-06 17 views
2

Im utilisant un flux xml distant, et je ne veux pas le frapper à chaque fois. Ceci est le code que j'ai jusqu'à présent:Mettre en cache un flux XML à partir d'une URL distante

$feed = simplexml_load_file('http://remoteserviceurlhere'); 
if ($feed){ 
    $feed->asXML('feed.xml'); 
} 
elseif (file_exists('feed.xml')){ 
    $feed = simplexml_load_file('feed.xml'); 
}else{ 
    die('No available feed'); 
} 

Ce que je veux faire est d'avoir frappé mon script le service à distance toutes les heures et le cache que les données dans le fichier flux.xml.

+0

Quelle partie de cette opération est votre question exactement? –

Répondre

4

Voici une solution simple:

Vérifiez la dernière fois que votre fichier feed.xml local a été modifié. Si la différence entre l'horodatage en cours et l'horodatage filemtime est supérieur à 3600 secondes, mettre à jour le fichier:

$feed_updated = filemtime('feed.xml'); 
$current_time = time(); 

if($current_time - $feed_updated >= 3600) { 

     // Your sample code here... 

} else { 

     // use cached feed... 
} 
0

J'ai créé une simple classe PHP pour résoudre ce problème. Comme j'ai affaire à une variété de sources, il peut gérer tout ce que vous lui lancez (xml, json, etc.). Vous lui donnez un nom de fichier local (à des fins de stockage), le flux externe et un temps d'expiration. Il commence par vérifier le fichier local. S'il existe et n'a pas expiré, il retourne le contenu. Si elle a expiré, elle tente de récupérer le fichier distant. S'il y a un problème avec le fichier distant, il retombera dans le fichier mis en cache.

Blog post ici: http://weedygarden.net/2012/04/simple-feed-caching-with-php/ code ici: https://github.com/erunyon/FeedCache

1
$feedmtime = filemtime('feed.xml'); 
$current_time = time(); 
if(!file_exists('feed.xml') || ($current_time - $feedmtime >= 3600)){ 
    $feed = simplexml_load_file($url); 
    $feed->asXML('feed.xml'); 
}else{ 
    $feed = simplexml_load_file('feed.xml'); 
} 
return $feed;