16

少し問題が発生しました。facebook と twitter API で遊んでいて、ステータス検索クエリの JSON 出力を問題なく取得できましたが、さらに読んで、ドキュメントから引用されているように「レート制限」になる可能性があることに気付きました。

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

このようなことに関するチュートリアルはほとんどないように思われるため、ヘルプやコードは非常に高く評価されます。

4

3 に答える 3

36

以下は、いくつかの 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 時間以上経過したキャッシュ データは破棄されます。これは単純な例であり、おそらくカスタマイズする必要があります。

于 2012-07-10T06:20:01.913 に答える
8

レート制限を回避するために、キャッシュを使用することをお勧めします。これは、私が最近書いたいくつかの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);
        }
于 2012-07-10T06:09:22.253 に答える
0

私はこの投稿が古いことを知っていますが、それはGoogleに表示されるので、探しているすべての人のために、JSON URLをカールして特定のフォルダーにあるファイルにキャッシュするこの単純なものを作成しました。 5分経っていない場合はカールしてください。ファイルから表示されます。タイムスタンプを使用して時間を追跡します。

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

使用法として、キャッシュされたすべてのファイル用のディレクトリを作成します。私にとっては/private/cache、たとえば x のようなリクエスト キャッシュ用に別のディレクトリを作成します。関数を呼び出すときは、htis のようにする必要があります ccurl('json_url','x') 。x は ID です。質問がある場合は、pls に尋ねてください。 ^_^ またお楽しみください (後で更新するかもしれないので、ID にディレクトリを使用しません)

于 2021-11-07T12:32:13.303 に答える