如何从许多外部XML页面预加载数据,以便在网站上近乎实时地显示其信息


How to pre-load data from many external XML pages to display their info on a website in near real-time?

我正在尝试构建一个脚本,该脚本将从许多(50多个)不同的外部XML页面中提取数据,使用PHP将其解析为一个表,并使用cron作业在后台执行,这样收集的数据就可以在我的网站上显示,而不会延迟用户加载。

这个脚本的目的是收集Steam社区小组成员名册的实时信息,显示当前在线成员和他们正在玩的游戏。它首先检查小组的XML页面以获得更新的成员列表,然后使用这些信息,检查每个成员的XML文件以获得他们当前的在线和游戏状态。

我在一定程度上是成功的。数据被正确加载和显示,大约80%的时间没有加载延迟。然而,在其他20%的时间里,用户完全无法加载超出并包括加载脚本的页面部分的网站。它只是加载所有内容,直到这一点,挂起几分钟,然后在刷新后正常工作。我一直无法复制挂断的情况,只是偶尔会随机发生。

我怀疑是cron作业(每隔3分钟)运行脚本导致了延迟,但这确实超出了我(已经有限)的理解范围。

有没有更好的方法来做我正在寻找的事情?或者知道是什么导致了间歇性的挂断吗?

提前感谢您的帮助!

<?php
$myFile = "steamfeed.php";
$fh = fopen($myFile, 'w');
$xml = simplexml_load_file('http://steamcommunity.com/groups/sundered/memberslistxml/?xml=1');
$members = $xml->xpath('//steamID64');
foreach($members as $steamID64) {
$xml2 = simplexml_load_file('http://steamcommunity.com/profiles/'.$steamID64.'/?xml=1');
if ( $xml2->onlineState != 'offline' ) {

$steam_game = substr($xml2->inGameInfo->gameName, 0, 25); 
$stringData = '<table width="280px" cellspacing="0" cellpadding="0" valign="top" style="vertical-align:text-top;"><tr><td               style="background-image:url(''http://www.thesunderedguard.com/images/statusbg.gif'');" width="288px" height="30px"><table width="100%"><tr><td width="50%" height="30px" style="text-align:left;"><a href="http://steamcommunity.com/profiles/'.$steamID64.'/" target="_blank" style="color:#CDCDCD;">'.$xml2->steamID.'</a></td><td width="50%"><a href="'.$xml2->inGameInfo->gameLink.'" target="_blank">'.$steam_game.'</a></td></tr></table></td></tr></table>';
fwrite($fh, $stringData);
} 
    } 
    fclose($fh);
?>

问题是,当cron正在运行获取信息时,您正在锁定steamfeed.php文件,因此当有人在运行cron的同时访问您的网站时,他们必须"等待",直到工作完成。我建议您使用一个临时文件,在其中编写XML返回的所有内容,然后在完成后将内容移动到生产中使用的文件中。

希望这能奏效!

您的问题是,当cron作业启动时,它会立即擦除当前文件。一旦发生这种情况,任何人来到您的网站都会看到一个空白页面,直到cron作业完成其任务。

在擦除旧内容文件之前,您需要在后台创建一个新的内容文件。这可能很简单,只需创建一个临时文件,在其中创建内容,然后重命名文件并删除旧文件。

在重命名文件时,这可能仍然会出现问题。您可以考虑使用符号链接,在每次出现cron作业时更改它链接到的文件,并不时整理旧版本。

我相信还有其他方法。。。