繁体   English   中英

使用PHP检索远程XML数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM