Zwischenspeichern der JSON-Ausgabe in PHP

Lesezeit: 5 Minuten

Zwischenspeichern der JSON Ausgabe in PHP
GeordieDave1980

Habe ein kleines Problem. Ich habe mit den Facebook- und Twitter-APIs gespielt und die JSON-Ausgabe von Statussuchabfragen problemlos erhalten, aber ich habe weiter gelesen und festgestellt, dass ich am Ende “ratenbegrenzt” sein könnte, wie aus der Dokumentation zitiert.

Ich habe mich gefragt, ob es einfach ist, die JSON-Ausgabe jede Stunde zwischenzuspeichern, damit ich zumindest versuchen kann, dies zu verhindern? Wenn ja, wie wird es gemacht? Als ich ein Youtube-Video ausprobiert habe, gab das nicht wirklich viele Informationen, nur wie man den Inhalt einer Verzeichnisliste in eine cache.php-Datei schreibt, aber es zeigte nicht wirklich, ob dies mit JSON-Ausgabe möglich ist und sicherlich habe nicht gesagt, wie man das Zeitintervall von 60 Minuten nutzt oder wie man die Informationen dann wieder aus der Cache-Datei bekommt.

Jede Hilfe oder Code wäre sehr dankbar, da es in Tutorials zu dieser Art sehr wenig zu geben scheint.

Hier eine einfache Funktion, die Caching hinzufügt, um einige URL-Inhalte zu erhalten:

function getJson($url) {
    // cache files are created like cache/abcdef123456...
    $cacheFile="cache" . DIRECTORY_SEPARATOR . md5($url);

    if (file_exists($cacheFile)) {
        $fh = fopen($cacheFile, 'r');
        $cacheTime = trim(fgets($fh));

        // if data was cached recently, return cached data
        if ($cacheTime > strtotime('-60 minutes')) {
            return fread($fh);
        }

        // else delete cache file
        fclose($fh);
        unlink($cacheFile);
    }

    $json = /* get from Twitter as usual */;

    $fh = fopen($cacheFile, 'w');
    fwrite($fh, time() . "n");
    fwrite($fh, $json);
    fclose($fh);

    return $json;
}

Es verwendet die URL, um Cache-Dateien zu identifizieren, eine wiederholte Anfrage an die identische URL wird beim nächsten Mal aus dem Cache gelesen. Es schreibt den Zeitstempel in die erste Zeile der Cache-Datei und zwischengespeicherte Daten, die älter als eine Stunde sind, werden verworfen. Dies ist nur ein einfaches Beispiel und Sie möchten es wahrscheinlich anpassen.

  • Letzteres scheint dort einfach genug zu sein, aber wie würde ich das auf meiner Website als verwenden. Ich bin immer noch ziemlich neu in PHP und lerne erst seit dem letzten Jahr, also verzeihen Sie meinen Neuling. Ich bin mir nicht sicher, was in $json = /* wie üblich von Twitter geholt wird */; Teil. Benutze ich es so:

    – GeordieDave1980

    10. Juli ’12 um 6:36

  • Mein Code:- code $query = “i%20hate%20my%20friend”; $query = urlencode($query); $url = “search.twitter.com/search.json?q={$query}&rpp=100&result_type=recent&lang=en”; $tweet = file_get_contents($url); $tweet_array = json_decode($tweet, true); foreach ($tweet_array[‘results’] als $data) { $profileimg = $data[‘profile_image_url’]; $postfrom = $data[‘from_user_name’]; $postfromid = $data[‘from_user_id’]; $erstellt = $daten[‘created_at’]; $message = $daten[‘text’];

    – GeordieDave1980

    10. Juli ’12 um 6:44

  • Ich habe einen Kommentar mit meinem Code hinterlassen, ich war mir nicht sicher, wie ich ihn in das Kommentarfeld einfügen soll. Hoffentlich können Sie ihn kopieren und einfügen und trennen, damit Sie wissen, wie er aussieht. Ich bin etwas verwirrt, was ich mit der Funktion anfangen soll.

    – GeordieDave1980

    10. Juli ’12 um 6:45

  • In deinem Fall die Zeile $tweet = file_get_contents($url) gibt Ihnen die rohen JSON-Daten. Das ist, was Sie suchen. Verwenden Sie in der obigen Funktion $json = file_get_contents($url);. Verwenden Sie in Ihrem Code $tweet = getJson($url); stattdessen die URL abzurufen und zwischenzuspeichern.

    – deceze
    ♦.

    10. Juli ’12 um 6:48

  • Prost für diesen Kerl, danke für die Hilfe!

    – GeordieDave1980

    10. Juli ’12 um 6:56

Es empfiehlt sich, Caching zu verwenden, um die Geschwindigkeitsbegrenzung zu umgehen. Hier ist ein Beispielcode, der zeigt, wie ich es für Google+ Daten gemacht habe, in einem PHP-Code, den ich kürzlich geschrieben habe.

private function getCache($key) {
    $cache_life = intval($this->instance['cache_life']); // minutes
    if ($cache_life <= 0) return null;

    // fully-qualified filename
    $fqfname = $this->getCacheFileName($key);

    if (file_exists($fqfname)) {
        if (filemtime($fqfname) > (time() - 60 * $cache_life)) {
            // The cache file is fresh.
            $fresh = file_get_contents($fqfname);
            $results = json_decode($fresh,true);
            return $results;
        }
        else {
            unlink($fqfname);
        }
    }

    return null;
}

private function putCache($key, $results) {
    $json = json_encode($results);
    $fqfname = $this->getCacheFileName($key);
    file_put_contents($fqfname, $json, LOCK_EX);
}

und um es zu benutzen:

        // $cacheKey is a value that is unique to the
        // concatenation of all params. A string concatenation
        // might work. 
        $results = $this->getCache($cacheKey);
        if (!$results) {
            // cache miss; must call out
            $results = $this->getDataFromService(....);
            $this->putCache($cacheKey, $results);
        }

Ich weiß, dass dieser Beitrag alt ist, aber er wird in Google angezeigt. Für alle, die suchen, habe ich diesen einfachen Beitrag erstellt, der eine JSON-URL kräuselt und in einer Datei in einem bestimmten Ordner zwischenspeichert, wenn Json erneut angefordert wird, wenn 5 Minuten vergangen sind curl es, wenn die 5 Minuten noch nicht vergangen sind, wird es aus der Datei angezeigt, es verwendet Zeitstempel, um die Zeit zu verfolgen und ja, viel Spaß

function ccurl($url,$id){

    $path    = "./private/cache/$id/";
    $files = scandir($path);
    $files = array_values(array_diff(scandir($path), array('.', '..')));
    if(count($files) > 1){
      foreach($files as $file){
        unlink($path.$file);
        $files = scandir($path);
        $files = array_values(array_diff(scandir($path), array('.', '..')));
      }
    }
    if(empty($files)){
      $c = curl_init();
      curl_setopt($c, CURLOPT_URL, $url);
      curl_setopt($c, CURLOPT_TIMEOUT, 15);
      curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($c, CURLOPT_USERAGENT,
          'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');
      $response = curl_exec($c);
      curl_close ($c);

      $fp = file_put_contents($path.time().'.json', $response);
      return $response;

    }else {


      if(time() - str_replace('.json', '', $files[0]) >  300){
        unlink($path.$files[0]);
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_TIMEOUT, 15);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_USERAGENT,
            'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');
        $response = curl_exec($c);
        curl_close ($c);

        $fp = file_put_contents($path.time().'.json', $response);
        return $response;
      }else {
        return file_get_contents($path. $files[0]);
      }
    }
  }

für die Verwendung erstellen Sie ein Verzeichnis für alle zwischengespeicherten Dateien, für mich ist es /private/cache Erstellen Sie dann ein weiteres Verzeichnis für den Request-Cache, wie zum Beispiel x, und beim Aufrufen der Funktion sollte es wie htis aussehen
ccurl('json_url','x')
wobei x die ID ist, wenn Sie eine Frage haben, fragen Sie mich bitte ^_^ auch viel Spaß (ich könnte es später aktualisieren, damit es kein Verzeichnis für die ID verwendet)

.

323100cookie-checkZwischenspeichern der JSON-Ausgabe in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy