2016-07-14 169 views
0

我正在为一个游戏组织制作网站,并且他们希望使用游戏开发者提供的API将他们的公会信息添加到他们的网站上。我正在使用的API有以下几点:当从.json文件循环结果时页面加载速度缓慢

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语句中循环。我可以用什么替代方法来防止这种情况发生?

+2

JSON的网址是一个问题,那就是缓慢的,不是你的代码。如果url响应很慢,很明显php会等待响应,然后继续。更多的是你再次在foreach中调用api url的n,这会使得响应更慢 –

+0

你可以使用类似AngularJS的东西来将页面上的元素绑定到模型。直到你在页面上看到结果的时间将是相同的,但它不会挂起。如果端点很慢,你的PHP输出将会很慢。 – KRONWALLED

回答

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。然后所有文件将被重新加载。

也许建立一个更好的类似DIR "../items/item{$id}.json"

+0

这对我很好 - 谢谢!从我的服务器删除项目{id} .json文件与更改false - > true相同?它强制文件重新下载,更正? –