0

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

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

我已经成功了一点。数据被正确加载和显示,并且没有加载延迟,大约 80% 的时间。然而,另外 20% 的时间,用户完全无法加载网站,包括加载脚本的页面部分。它只是加载所有内容,然后挂起几分钟,然后在刷新后正常工作。我一直无法复制挂断的条件,它只是偶尔随机发生。

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

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

提前感谢您的帮助!

<?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);
?>
4

2 回答 2

0

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

希望这有效!

于 2013-07-09T03:15:51.123 回答
0

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

您需要在删除旧内容文件之前在后台创建一个新内容文件。这可能就像创建一个临时文件、在其中创建内容、然后重命名文件并删除旧文件一样简单。

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

我敢肯定还有其他方法...

于 2013-07-09T03:17:25.583 回答