2016-07-14 17 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

のような、より良いdirはJSON URLがないあなたのコード、それが遅い、問題となっている設定。 URLの応答が遅い場合は、PHPが応答を待ってから処理を進めることは明らかです。あなたはさらに、foreach内でapi urlを再び呼び出して応答を遅くします。 –

+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、次回のpageloadではWEBから再度フェッチされず、指定されたファイルが使用されます。それはすぐに終了します。

WEBからすべてのファイルをリロードする場合は、2番目のパラメータ$forceDownloadを使用し、trueに設定します。その後、すべてのファイルが再度ロードされます。

そしておそらく"../items/item{$id}.json"

+0

これは私にとって素晴らしい仕事でした - ありがとう!アイテム{id} .jsonファイルを私のサーバから削除するのは、false - > trueを変更するのと同じですか?ファイルを強制的に再ダウンロードして修正しますか? –

関連する問題