<?php
function xmlGetFeed($url)
{
if(false === $xml = @file_get_contents($url))
{
$xml = '';
die('Could not retrieve feed from: '.$url);
}
else
{
define('XML_DATA', file_get_contents($url));
}
if(false === $xml = @simplexml_load_string(XML_DATA))
{
$xml = '';
die('The feed provided is not valid XML');
}
else
{
return XML_DATA;
}
}
function xmlCached($path,$file,$url,$time) //URL,FILE_NAME,PATH,TIME
{
define('SCRIPT_ROOT',dirname(__FILE__).'\\');
if(empty($path)) //USE SCRIPT ROOT
{
if(!is_writable(SCRIPT_ROOT))
{
die('The cache directory: '.SCRIPT_ROOT.' is not writable');
}
else
{
define('XML_CACHE_DIR',SCRIPT_ROOT);
}
}
else
{
if(file_exists($path))
{
if(!is_writable($path))
{
die('The cache directory: '.$path.' is not writable');
}
else
{
define('XML_CACHE_DIR',$path);
}
}
else
{
if(!mkdir($path))
{
die('Could not create the path: '.$path);
}
else
{
define('XML_CACHE_DIR',$path);
}
}
}
if(empty($file)) //NO FILENAME SPECIFIED
{
define('XML_CACHE_FILE','default.xml');
}
else
{
define('XML_CACHE_FILE',$file);
}
define('XML_CACHE_PATH',XML_CACHE_DIR.'\\'.XML_CACHE_FILE);
if(file_exists(XML_CACHE_PATH))
{
if(!is_writable(XML_CACHE_PATH))
{
die(XML_CACHE_FILE.' is not writable in: '.XML_CACHE_DIR);
}
else
{
define('XML_MODIFIED',filemtime(XML_CACHE_PATH));
define('XML_AGE',time() - XML_MODIFIED);
}
}
else
{
define('XML_MODIFIED',FALSE);
define('XML_AGE',FALSE);
}
if(empty($time))
{
define('XML_LIFETIME',3600);
}
else
{
define('XML_LIFETIME',$time);
}
if(empty($url))
{
die('Please specify a XML feed to cache');
}
else
{
define('XML_URL',$url);
}
if(!XML_MODIFIED || !XML_AGE) //FILE DOESNT EXIST
{
file_put_contents(XML_CACHE_PATH,xmlGetFeed(XML_URL));
return simplexml_load_file(XML_CACHE_PATH);
}
elseif(XML_AGE > XML_LIFETIME) //EXPIRED, UPDATE IT
{
file_put_contents(XML_CACHE_PATH,xmlGetFeed(XML_URL));
return simplexml_load_file(XML_CACHE_PATH);
}
else
{
return simplexml_load_file(XML_CACHE_PATH);
}
}
$xml = xmlCached('g:\\test','','http://www.woot.com/blog/rss.aspx','',''); //URL,FILE_NAME,URL,TIME
print_r($xml);
?>
Comments? I tried to be thorough in the testing for permissions and expected return types