使用PHP检索远程XML数据

时间:2010-05-29 06:54:52

标签: php xml

我目前正在使用PHP(simpleXML)阅读定期更新的XML文件。

我想通过在我的网络服务器上读取缓存文件来减少对远程服务器的调用,然后在一段时间后,检索远程文件的新副本。

这是读取远程XML文件,然后解析的公认惯例吗?任何人都可以提供一些关于如何在PHP中解决这个问题的建议,或者也许有一些PEAR课程可以解决这个问题?

3 个答案:

答案 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);
}

哦,我差点忘了。如果您可以访问某些cron功能,那么有一种更好,更简单的方法。只需设置一个cron作业,每5或10分钟无条件下载该远程资源。然后,让您的PHP脚本无条件地从缓存文件中读取,而不是根本不关心远程资源。这样,就延迟而言,没有“最坏情况”的情况。否则,每次脚本刷新缓存时,它都会使用户比从缓存中获取的内容更加等待。

答案 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);
}