你可以在不加载完整文件的情况下获得特定的xml值吗?

时间:2011-01-10 10:40:51

标签: php xml load

我最近编写了一个PHP插件来与我的phpBB安装接口,它将获取我的用户的Steam ID,将它们转换为Steam在其网站上使用的社区ID,获取该社区ID的xml文件,获取值avatarFull(包含完整头像的链接),通过curl下载,调整大小,并将其设置为用户的新头像。

实际上,它正在将我的论坛的头像与Steam的头像同步(Steam是一个游戏社区/平台,我经营一个游戏战队)。我的问题是,每当我从xml文件中读取值时,每个用户需要大约一秒钟,因为它在搜索变量之前加载整个xml文件,这会导致整个脚本需要很长时间才能完成。

理想情况下,我希望我的脚本每天运行几次,以检查Steam中的每个avatarFull值并检查它是否已更改(并下载文件,如果有),但目前我需要花费太长时间捆绑一切等待它。

有没有办法让服务器只提供我正在寻找的xml值而不加载整个东西? 以下是我如何调用当前值:

$xml = @simplexml_load_file("http://steamcommunity.com/profiles/".$steamid."?xml=1");
$avatarlink = $xml->avatarFull;

这是一个示例xml文件:XML file

5 个答案:

答案 0 :(得分:2)

文件不大。解析它并不需要花费太多时间。你的第二个浪费主要是为了网络通信。

由于无法解决此问题,您必须实现缓存。每小时左右安排一个将在您的服务器上运行的脚本,寻找更改。这个脚本需要花费很多时间 - 每个用户至少需要一秒钟;如果必须下载图片,则需要几秒钟。

如果有最新图片,则会将其存储在服务器上的某个预定义位置。为您的网页提供服务的脚本将使用此位置,而不是与Steam通信。这样他们就能立即工作,图片最多可以在1小时之内过时。

已添加:这是一个补充这一点的想法:让访问者向Steam执行AJAX请求,并检查图片是否已通过JavaScript更改。仅对他们实际查看的图片执行此操作。如果有,则可以立即在浏览器中替换过时的图片。您也可以通知您的服务器,然后他们可以立即下载更新的图片。也许你甚至不需要自己安排任何事情。

答案 1 :(得分:1)

您必须阅读整个流以获取所需的数据,但不必将其保存在内存中。

如果我用Java做这个,我会使用SAX解析器而不是DOM解析器。我可以处理我感兴趣的几个值,而不是在内存中保留一个大的DOM。看看PHP是否有类似的东西。

答案 2 :(得分:1)

SimpleXml是一个DOM解析器。它将加载并将整个文档解析到内存中,然后才能使用它。如果您不想这样做,请使用XMLReader,它允许您在从流中读取XML时处理XML,例如:一旦获取了头像,你就可以退出处理。

但与本页其他地方已经指出的其他人一样,如图所示的文件很小,这可能是网络延迟问题,而不是XML问题。

另见Best XML Parser for PHP

答案 3 :(得分:0)

该文件看起来足够小。解析它不应该花那么长时间。由于某种网络问题和解析速度慢,可能需要很长时间。

如果网络是您的问题,那么没有多少技巧可以帮助您:(。

如果不是网络,那么您可以尝试在输入上进行正则表达式匹配。这可能会略微加快。

试试这个表达式:

/<avatarFull><![CDATA[(.*?)]]><\/avatarFull>/

并阅读第一组比赛的链接。

您可以尝试SAX解析方式(http://php.net/manual/en/book.xml.php),但正如我所说,因为文件很小,我怀疑它会真正有所作为。

答案 4 :(得分:0)

您可以利用在memcached或filesystem之类的地方缓存simplexml_load_file()的结果。这是典型的工作流程:

  • 检查XML文件是否在过去N秒内处理
  • 成功返回处理结果
  • 失败时从simplexml获得结果
  • 处理他们
  • 调整图片大小
  • 将结果存储在缓存中