从.json文件循环结果时加载页面缓慢

时间:2016-07-14 14:22:01

标签: php json api foreach

我正在为一个游戏小组制作一个网站,他们希望使用游戏开发者提供的API在他们的网站上添加他们的公会信息。我正在使用的API如下:

https://wiki.guildwars2.com/wiki/API:1/item_details https://wiki.guildwars2.com/wiki/API:2/guild/:id/treasury

现在,我有一张桌子可以显示库房中的物品,需要多少物品以及需要多少物品。它看起来像这样:

Item name     |     Quantity     |    Needed
-----------------------------------------------------
Iron Ore      |     150          |    1500
Mithril Ingot |     134          |    1000
etc...

这是我的PHP代码:

// This gets a particular item.
function getItem($id) {
    $response = file_get_contents("https://api.guildwars2.com/v1/item_details.json?item_id=".$id);
    $response = json_decode($response, false);
    return $response;
}
// This gets the name if item 123
// echo getItem(123)->name;

// Begin table.
echo '<table class="table table-striped">';

$treasuryItem = file_get_contents('https://api.guildwars2.com/v2/guild/B95A3B40-A764-4648-8EE6-39549E922A99/treasury?access_token=358AC6CB-0596-D64F-88D5-5CFA9AA27AAA273F3C6A-BC9E-47EE-AA28-63565C3EFEEE');
$treasuryItem = json_decode($treasuryItem);

foreach($treasuryItem as $key => $treasuryItem) {

    echo '<tr>';
    echo '<td>'.getItem($treasuryItem->item_id)->name.'</td>';   // This is where I think the trouble lies.
    echo '<td>'.$treasuryItem->count.'</td>';
    echo '<td>';
        foreach($treasuryItem->needed_by as $key => $treasuryItem) {
            echo $treasuryItem->count.'<br />';
        }
    echo '</td>';
    echo '</tr>';

}
echo '</table>';

现在看来,它有效,信息显示为我喜欢它。我的问题是页面加载需要很长时间。我认为问题是调用Item API文件的函数在foreach语句中循环。我可以使用哪种替代方法来防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

项目的链接似乎是公开的,我设置的东西项目不会改变。也许他们会在补丁之后改变。

如果您记住这一点,您可以在服务器上保存信息。 将功能更改为:

function getItem($id,$forceDownload=false) {
   $response=null;
   $file = "item{$id}.json";
   if(!file_exists($file) || $forceDownload){
       $response = file_get_contents("https://api.guildwars2.com/v1/item_details.json?item_id=".$id);
       file_put_contents($file,$response);
   }
   if(!$response){
    $response = file_get_contents($file);
   }
   return json_decode($response, false);
}

现在,每个项目都会保存一个文件,例如item123.json,下次在页面加载时,它不会再次从WEB中获取,而是使用给定的文件。那将会更快退出。

如果要从WEB重新加载所有文件,请使用第二个参数$forceDownload并将其设置为true。然后将再次加载所有文件。

也许可以设置一个更好的目录,如"../items/item{$id}.json"