[英]Retrieve remote XML data with PHP
我目前正在阅读使用PHP(simpleXML)定期更新的XML文件。
我想通过读取Web服务器上的缓存文件来减少对远程服务器的调用,然后过一段时间后,检索远程文件的新副本。
这是读取远程XML文件然后进行解析的公认做法吗? 谁能提供一些有关如何在PHP中进行此操作的建议,或者也许有一些PEAR类可以解决此问题?
是的,这不仅是一种公认的做法,而且在处理远程资源时也建议这样做。
在PEAR和其他版本中有通用缓存管理器,但是在您的情况下,一个简单的自制解决方案也可以工作。 像这样的东西:
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);
}
哦,我差点忘了。 如果您可以使用某些cron功能,则有更好,更轻松的方法。 只需设置一个cron作业即可每5或10分钟无条件下载该远程资源。 然后,让您的PHP脚本无条件地从缓存文件中读取,并且完全不用理会远程资源。 这样,就延迟而言,没有“最坏情况”的情况。 否则,每次脚本刷新缓存时,与从缓存中获取脚本相比,它会使用户等待的时间明显更多。
也许是这样的吗? 如果没有高速缓存文件或高速缓存已过期(在这种情况下已超过十分钟),则从服务器获取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");
如果您将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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.