我正在为一个游戏小组制作一个网站,他们希望使用游戏开发者提供的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
语句中循环。我可以使用哪种替代方法来防止这种情况发生?
答案 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"