javascript - グラフapiエクスプローラ - Facebookグラフ API キャッシュ JSON 応答




graph api facebook explorer (3)

Facebookのファンページからコンテンツを取得し、それらをウェブサイトに表示するためにFacebook Graph APIを使用しています。 私はこれをしている、それは働いているが、どういうわけか、私のホスティングプロバイダが特定の時間ごとに私の要求を制限しているようだ...私は応答をキャッシュしたいと思います。例。

$data = get_data("https://graph.facebook.com/12345678/posts?access_token=1111112222233333&limit=20&fields=full_picture,link,message,likes,comments&date_format=U");
$result = json_decode($data);

get_data関数は、次のようにCURLを使用します。

function get_data($url) {
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $datos = curl_exec($ch);
    curl_close($ch);
    return $datos;
}

これは正常に動作します。私はJSONデータのレスポンスを出力し、コンテンツを表示するために自分のウェブサイトに好きなように使っています。 しかし、私が言及したように、私のホスティングでは、これはX時間ごとに失敗するようです。制限されているからです。 私はここでStackoverflowで見たいくつかのコードを使用して応答をキャッシュしようとしました。 しかし、私はどのように両方のコードを統合して使用するのか分かりません。 私はキャッシュファイルを作成することができましたが、キャッシュされたファイルから正しく読み込み、FacebookグラフAPIへの新しいリクエストを避けることはできません。

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

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

return $json;

事前に多くのお手伝いをありがとうございます!

https://code.i-harness.com


この回答はあなたのプロジェクトにいくつかの依存関係を追加しますが、あなた自身のものを動かす代わりに、それは価値があるかもしれません。

HTTP Cacheプラグインと組み合わせて、 Guzzle HTTPクライアントを使用することができます。

$client = new Client('http://www.test.com/');

$cachePlugin = new CachePlugin(array(
    'storage' => new DefaultCacheStorage(
        new DoctrineCacheAdapter(
            new FilesystemCache('/path/to/cache/files')
        )
    )
));

$client->addSubscriber($cachePlugin);

$request = $client->get('https://graph.facebook.com/12345678/posts?access_token=1111112222233333&limit=20&fields=full_picture,link,message,likes,comments&date_format=U');
$request->getParams()->set('cache.override_ttl', 3600*8); // 8hrs

$data = $request->send()->getBody();
$result = json_decode($data);

できる場合は、memcacheを使用することができますか?

$cacheFile = 'cache' . DIRECTORY_SEPARATOR . md5($url);
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);
$cached = $mem->get($cacheFile);
if($cached){
  return $cached;
}
else{
  $data = get_data($url);
  $mem->set($cacheFile, json_encode($data), time() + 60*10); //10 min
}

ホスティングプロバイダがすべてのアウトバウンドリクエストをプロキシサーバー経由でプッシュしている場合は、リクエストの先頭付近に余分なパラメータを追加して無効にすることができます。

https://graph.facebook.com/12345678/posts?p=(randomstring)&access_token=1111112222233333&limit=20&fields=full_picture,link,message,likes,comments&date_format=U

私はサードパーティのデータプロバイダへのアウトバウンドコールにこれをうまく使用しました。 もちろん、あなたの特定の問題がこの問題であるかどうかはわかりません。 あなたが期待していないパラメータでリクエストを拒否した場合、プロバイダはそれに噛まれる可能性もあります。





caching