2012-07-10 26 views
12

ちょっとした問題がありました。 facebookとtwitter APIを使って遊んで、ステータス検索クエリのJSON出力を得ることは問題ありませんでしたが、私はさらに読んだことがあり、ドキュメントから引用されたように "レート制限"に終わる可能性があることに気付きました。PHPでのJSON出力のキャッシュ

JSON出力を毎時キャッシュするのは簡単なので、少なくとも試してこれを防ぐことができますか?もしそうなら、それはどのように行われますか?私はYouTubeのビデオを試しましたが、実際にはディレクトリリストの内容をcache.phpファイルに書き込む方法についての情報はあまりありませんでしたが、これがJSONの出力で可能かどうかは確かに指摘されていませんでした60分の時間間隔を使用する方法や、情報をキャッシュファイルから取り戻す方法については言及していませんでした。

このようなことについてチュートリアルではほとんどないようですが、どんなヘルプやコードも非常に高く評価されます。

答えて

26

ここではいくつかのURLの内容を取得し、キャッシュを追加し、簡単な機能:

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

をそれを繰り返し、キャッシュファイルを識別するためにURLを使用しています同じURLへのリクエストは、次回にキャッシュから読み込まれます。キャッシュファイルの最初の行にタイムスタンプを書き込み、1時間より古いキャッシュデータを破棄します。それは単なる例であり、おそらくそれをカスタマイズしたいと思うでしょう。

+0

最後のものはそこでは単純だと思われますが、私はどのように私のサイトでそれを使用しますか?私はまだPHPにはまだまだ慣れていて、過去1年間学習していますので、私の正気を許してください。 $ json =/*いつものようにtwitterから取得するかどうかわからない。部。 – GeordieDave1980

+0

私のコード: - 'code' $ query =" i%20hate%20my%20girlfriend "; $ query = urlencode($ query); $ url = "http://search.twitter.com/search.json?q={$query}&rpp=100&result_type=recent&lang=ja"; $ tweet = file_get_contents($ url); $ tweet_array = json_decode($ tweet、true); foreach($ tweet_array ['results'] $ data) { $ profileimg = $ data ['profile_image_url']; $ postfrom = $ data ['from_user_name']; $ postfromid = $ data ['from_user_id']; $ created = $ data ['created_at']; $ message = $ data ['text']; – GeordieDave1980

+0

私は自分のコードにコメントを残していますが、コメントボックスに入れる方法がわかりませんでした。うまくいけば、コピーして貼り付けて、それを見分けることができます。私はこの機能で何をすべきかについて混乱している。 – GeordieDave1980

4

キャッシュを使用してレート制限を回避することをお勧めします。 ここに、私が最近書き込んだPHPコードの中で、私がGoogle+データのためにどのようにしたかを示すいくつかのコード例があります。

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

とそれを使用する:

 // $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); 
     } 
+0

getCacheFileName($ key)のコードは何ですか? – simpatico

関連する問題