2017-05-08 3 views
0

ich zur Zeit auf einer Fanseite arbeiten (nur für meine Zwecke), die alle bekommt es Daten aus verschiedenen APIs wie folgt aus:wie zu beschleunigen file_get_contents und json_decode

$newjson = file_get_contents(LINK_TO_JSON_HERE); 
$newarr = json_decode($newjson); 

Mein Problem mit diesem: zur Zeit der Website lädt 13 verschiedene (riesige) JSON-Dateien, was die Seite sehr verlangsamt. Das Laden dauert bis zu 30 bis 45 Sekunden, was nicht wirklich akzeptabel ist, aber ich habe versucht, es zum Laufen zu bringen, bevor ich es optimiert habe. Ist es möglich, dies mit anderen Funktionen zu beschleunigen? Als ich sah, dass andere Fansites denselben Inhalt innerhalb von 1 Sekunde luden, fragte ich mich.
Über die Funktionalität: Ich lade den gesamten JSON in das Array und dann die Informationen, die ich brauche, die oft weniger als 1% der JSON-Datei Text ist. Gibt es eine Möglichkeit, die Dinge zu filtern, die ich brauche, bevor ich das gesamte Dokument in ein Array lade?

Vielen Dank im Voraus

+0

Wenn das ein JSON-Daten, die Sie nicht wirklich brauchen php laden .. Sie einfach die Seite und auf document.ready aus diesen Dateien immer json Daten starten und es von js verwenden Das ist, warum Js gut –

Antwort

1

Die Chancen sind sehr hoch, dass der JSON Sie nicht verlangsamt, sondern nur die file_get_contents(). Benchmarkieren Sie Ihr Problem richtig, damit Sie nicht Ihre Zeit verschwenden, indem Sie das Falsche optimieren.

<?php 
$start = microtime(true); 
$newjson = file_get_contents(LINK_TO_JSON_HERE); 
echo 'file_get_contents('.htmlentities($LINK_TO_JSON_HERE).'): '.(microtime(true) - $start).' seconds<br>'; 

$start = microtime(true); 
$newarr = json_decode($newjson); 
echo 'json_decode(): '.(microtime(true) - $start).' seconds<br><br>'; 

Anyways, der beste Weg, Daten in Echtzeit zu erhalten und eine höhere Geschwindigkeit zu erhalten, ist zu wechseln curl_multi_exec()

Ich bin nicht sicher, wie oft die Daten auf diesen APIs aktualisiert, so können Sie auch entwickeln eine Art Caching-Mechanismus, der die Daten einige Male pro Tag holt und lokal in einer JSON-Datei speichert.

+0

Danke für die Antwort! Jetzt weiß ich, welche der Dateien am langsamsten zu laden ist. Zum Beispiel https://eu.api.battle.net/wow/data/character/achievements?locale=de_DE&apikey=API_KEY_HERE (Sie benötigen einen API-Key, um es anzuzeigen) dauert 4,6 Sekunden zum Laden. Ich werde jetzt in 'curl_multi_exec()' schauen, vielleicht kann mir das helfen. – neverlucky

+0

@neverlucky Wenn 4,6 Sekunden Ihre langsamste API ist, kann 'curl_multi_exec()' die Ladezeiten Ihrer Seite bestenfalls nur auf 4,6 Sekunden reduzieren. Sie müssen entweder eine schnellere API finden oder einen Caching-Mechanismus implementieren. – MonkeyZeus

+0

@neverlucky Jedes Glück mit diesem? – MonkeyZeus

0

Dies ist kein Problem der Geschwindigkeit von Funktionen, sondern auf eine Antwort von dem anderen Server zu warten. Wenn es möglich ist, können Sie die Daten zwischenspeichern.

+0

Das ist nicht, was die Frage war ungefähr. @neverlucky fragte nach dem Filtern der JSON-Dateien, nicht zwischenspeichern. Ich verstehe, aber es beantwortet die Frage nicht. –