我目前正在使用PHP(simpleXML)阅读定期更新的XML文件。
我想通过在我的网络服务器上读取缓存文件来减少对远程服务器的调用,然后在一段时间后,检索远程文件的新副本。
这是读取远程XML文件,然后解析的公认惯例吗?任何人都可以提供一些关于如何在PHP中解决这个问题的建议,或者也许有一些PEAR课程可以解决这个问题?
答案 0 :(得分:2)
是的,这不仅仅是一种公认的做法,在处理远程资源时,它是推荐的做法。
PEAR和其他librairies中有通用缓存管理器,但在您的情况下,简单的自制解决方案也可以正常工作。这样的事情:
function get_xml($url, $max_age)
{
$file = '/path/to/cache/dir/' . md5($url);
if (file_exists($file)
&& filemtime($file) >= time() - $max_age)
{
// the cache file exists and is fresh enough
return simplexml_load_file($file);
}
$xml = file_get_contents($url);
file_put_contents($file, $xml);
return simplexml_load_string($xml);
}
考虑一下,您可以使用copy()
来检索资源。在大多数情况下它不会有任何区别,但如果外部资源恰好非常大,它对PHP的内存管理器会稍微温和一些。但即便如此,如果你在内存中加载一个巨大的XML,你会遇到比下载方式更大的问题:)
function get_xml($url, $max_age)
{
$file = '/path/to/cache/dir/' . md5($url);
if (!file_exists($file)
|| filemtime($file) < time() - $max_age)
{
// the cache file doesn't exists or is not fresh enough
copy($url, $file);
}
return simplexml_load_file($file);
}
答案 1 :(得分:0)
也许是这样的?如果没有缓存文件或缓存已过期(在这种情况下超过十分钟),则从服务器获取XML文件。
$filename = 'myxmlfile.xml';
if(!file_exists("cache/$filename") || filemtime("cache/$filename") - time() > 600) {
$f1 = fopen("http://example.com/rss.xml", 'r');
$f2 = fopen("cache/$filename", 'w');
while(!feof($f1)) {
fwrite($f2, fread($f1, 8192));
}
fclose($f1);
fclose($f2);
}
$doc = simplexml_load_file("cache/$filename");
答案 2 :(得分:0)
如果您使用Flash与AS3(ActionScript 3),您可以执行类似于给定地址的URLRequest ...
我想你已经有了PHP文件......
让我们说是
<?php
$lstrXML = "";
$lstrXML .= "<?xml version="1.0"?>";
$lstrXML .= "<root>";
$lstrXML .= "<node1>";
$lstrXML .= "<data cd='1' ds='a' />";
$lstrXML .= "<data cd='1' ds='a' />";
$lstrXML .= "<data cd='1' ds='a' />";
$lstrXML .= "<data cd='1' ds='a' />";
$lstrXML .= "</node1>";
$lstrXML .= "</root>";
echo($lstrXML);
?>
在AS3 ......某个地方......
var xmlLoader:URLLoader = new URLLoader();
var xmlData:XML = new XML();
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
xmlLoader.load(new URLRequest("xmltest.php"));
function LoadXML(e:Event):void
{
xmlData = new XML(e.target.data);
}