2017-07-02 4 views
0

Ich zeige Highcharts auf meiner Website, die die Daten einer externen API visualisiert. Anstatt diese API mit jedem Seitenaufruf aufzurufen, möchte ich die abgerufenen Daten lokal in einer Cachedatei speichern. Der nächste Benutzer, der die Seite besucht, sollte die Highcharts-Daten von dieser lokalen Cachedatei abrufen, anstatt von der API-URL (um API-Aufrufe und Highcharts Ladezeit zu reduzieren). Die Cachedatei sollte 60 Minuten lang aktuell sein.PHP Cache externe JSON API in lokaler Datei - funktioniert nicht

Ich habe hier eine Antwort gefunden 5-minute file cache in PHP, aber es funktioniert nicht für mich.

ich kopiert grundsätzlich den Code in meine eigene PHP-Datei:

.... 
//to be sure about the correct file path, 
//I used here the absolute URL of my site: "https://www.example.com/path/to/my/cache.json" 
$cache_file = "path/to/my/cache.json"; 

$api_url = "http://www.someapi.com/api"; 

if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 60 * 60))) { 
// Cache file is less than 60 minutes old. 
//Don't bother refreshing, just use the file as-is. 
    $json = file_get_contents($cache_file); 

} else { 
//Our cache is out-of-date, so load the data from our remote server, 
//and also save it over our cache for next time. 
    $json = file_get_contents($api_url); 
    file_put_contents($cache_file, $json); 
} 

//decode JSON to array 
$data = json_decode($json,true); 
.... 

wheni meine Seite laden, werden die die Highcharts die Ergebnisse anzeigt, aber anscheinend nur durch die API-URL. Meine cache.json Datei bleibt leer. Ich gab es chmod 777 und so tat ich für das übergeordnete Verzeichnis Daten und dataCache.

Um den Code zu testen, habe ich versucht, zu debuggen out-Kommentierung die Linie

//$json = file_get_contents($api_url); 

Was dann passiert, ist, dass die Highcharts gar nicht alle Daten angezeigt werden soll. Also habe ich gelernt, dass die IF-Schleife etwas funktioniert - aber nicht so, wie es sollte.

Ich kopierte dann die JSON-Daten aus der API-Antwort und speicherte sie in meiner cache.json Datei. Now-Kommentar gesetzt ich die Linie

//$json = file_get_contents($api_url); 

Ich habe gehofft, dass ich da eine frisch erstellten cache.json Datei, die ersten IF-Bedingung erfüllt sein würde und damit die Highchart würden die Daten aus meiner Cache-Datei abrufen . Das ist jedoch nicht geschehen. Die Highcharts zeigen keine Daten mehr an.

Können Sie mir bitte helfen zu verstehen, warum der Code nicht funktioniert (obwohl ich es grundsätzlich von hier kopiert 5-minute file cache in PHP)?

P.S .: Ich bin mir nicht sicher, ob dies vielleicht nur eine "doppelte" Frage ist. Aber da die Antwort in der ursprünglichen Frage für mich nicht funktioniert, war ich mir nicht sicher, wie/wo ich fragen sollte.

+0

Diese 'https: // www.example.com/data/dataCache/cache.json' sieht nicht wie eine lokale Datei aus. – RiggsFolly

Antwort

0

Ihr Problem könnte die externe URL sein.

Gemäß der file_put_contents documentation:

Tip
Eine URL kann mit dieser Funktion als Dateinamen verwendet werden, wenn die fopen Wrapper aktiviert wurden.
Weitere Informationen zum Angeben des Dateinamens finden Sie unter fopen().
In den unterstützten Protokollen und Wrappern finden Sie Links zu Informationen über die Fähigkeiten der verschiedenen Wrapper, Hinweise zu ihrer Verwendung und Informationen zu vordefinierten Variablen, die sie möglicherweise bereitstellen.

file_put_contents wird in der Regel aufgerufen, um Daten lokal zu speichern.Für den externen Speicher gibt es andere Möglichkeiten, Daten sicher zu speichern (Sie können sich einen FTP-Client ansehen).

Überprüfen Sie den Rückgabewert Ihres Anrufs.

Diese Funktion gibt die Anzahl der Bytes zurück, die in die Datei geschrieben wurden, oder FALSE bei einem Fehler.

Meine Vermutung ist es zurück false.

Wenn Sie auf dem gleichen Server, Daten speichern möchten, versuchen Sie einen Dateisystempfad (wie „/someting/a.file“)

Auch die Sie schreiben verknüpft klar gesagt:

Verwenden Sie eine lokale Cache-Datei, und überprüfen Sie einfach die Existenz und die Änderungszeit für die Datei, bevor Sie sie verwenden. Beispiel: Wenn $ cache_file ein lokaler Cache-Dateiname ist, [...]

+0

Danke für Ihre schnelle Antwort. Aber ich bin mir nicht sicher, ob wir uns falsch verstehen: Ich möchte Daten lokal speichern. Daher habe ich eine leere cache.json Datei lokal erstellt. Und wenn ich den obigen Code ausführe, wird die externe URL erfolgreich aufgerufen, aber die Datei cache.json bleibt leer. Aber mein Code sollte die API-Daten abrufen ** und ** in der cache.json speichern. Aber dieser zweite Teil passiert aus irgendeinem Grund nicht. Bitte beachten Sie, dass ich "example.com" als Beispiel verwendet habe. Betrachte es als meine Domäne. – bauhausweb

+1

Wenn '$ cache_file =" https://www.example.com/data/dataCache/cache.json ";', ist das kein lokaler Dateipfad (selbst _if_, der auf eine lokale Datei auf Ihrem Server verweist). Wenn es mit "http" beginnt, ist es nicht lokal. Versuchen Sie etwas wie '/ tmp/cache.json' zu verwenden, nur um es zu testen. Wenn das funktioniert, dann müssen Sie Ihre '$ cache_file' auf etwas wie'/var/www/project/data/dataCache/cache.json' aktualisieren –

+0

Verwenden Sie auch absolute Pfade (sah Ihre Post-Aktualisierung und wollte dies klären). Absolute Pfade beginnen mit '/' (oder "C:", wenn Sie Windows verwenden). Stellen Sie also sicher, dass entweder Ihr relativer Pfad "path/to/my/cache.json" gleich ist, oder verwenden Sie einen absoluten Pfad wie "/path/to/my/cache.json" –