2016-07-14 6 views
0

Ich mache eine Website für eine Gaming-Gruppe und sie möchten ihre Gildeninformationen auf ihrer Website mit der von den Spieleentwicklern bereitgestellten API hinzufügen. Die APIs Ich arbeite mit sind die folgenden:Langsames Laden der Seite beim Loopen von Ergebnissen aus einer .json-Datei

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

Gerade jetzt, ich habe eine Tabelle zu zeigen, welche Elemente in der Kasse sind, wie viele und wie viele benötigt werden. Es sieht wie folgt aus:

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

Und das ist mein PHP-Code:

// 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>'; 

Wie es jetzt aussieht, es funktioniert und die Informationen angezeigt, wie ich es möchte sein. Mein Problem ist, dass das Laden der Seite sehr lange dauert. Ich denke, das Problem ist, dass die Funktion, die die Item-API-Datei aufruft, in der foreach-Anweisung geloopt wird. Mit welcher alternativen Methode kann dies verhindert werden?

+2

Die json url ist ein Problem, das ist langsam, nicht Ihr Code einrichten. Wenn die URL-Antwort langsam ist, ist es offensichtlich, dass PHP auf die Antwort von ihm wartet und dann fortfahren. und noch mehr rufst du die api-urls wieder in der foreach an, was die Antwort noch langsamer macht. –

+0

Du kannst etwas wie AngularJS verwenden, wo du die Elemente auf deiner Seite an ein Modell binden würdest. Die Zeit, bis Sie die Ergebnisse auf der Seite sehen, wäre die gleiche, aber sie würde nicht hängen bleiben. Wenn der Endpunkt langsam ist, wird Ihre PHP-Ausgabe langsam sein. – KRONWALLED

Antwort

1

Der Link zu den Elementen scheint öffentlich, und ich denke, dass Elemente nicht nach der Einrichtung ändern. Vielleicht ändern sie sich nach einem Patch oder so.

Wenn Sie dies im Hinterkopf behalten, können Sie die Informationen auf Ihrem Server speichern. Ändern Sie die Funktion dieses :

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); 
} 

nun für jedes Element eine Datei beispielsweise gespeichert werden würde item123.json, beim nächsten Mal wird es nicht mehr aus dem WEB geholt, sondern es wird die angegebene Datei verwendet. Das wird dann schneller beendet.

Wenn Sie alle Dateien aus WEB neu laden möchten, verwenden Sie den zweiten Parameter $forceDownload und setzen Sie ihn auf true. Dann werden alle Dateien erneut geladen.

Und vielleicht ein besser dir wie "../items/item{$id}.json"

+0

Das hat super für mich funktioniert - danke! Löscht die {ID} .json-Dateien des Elements von meinem Server genauso wie das Ändern von false -> true? Es zwingt die Dateien neu zu downloaden, korrigieren? –