Возникла небольшая проблема. Играя с API facebook и twitter и получая JSON-вывод запросов поиска по статусу, нет проблем, однако я еще раз прочитал и понял, что могу оказаться «ограниченным курсом», как указано в документации.
Мне было интересно, легко ли кэшировать выход JSON каждый час, чтобы я мог хотя бы попытаться предотвратить это? Если да, то как это делается? Поскольку я пробовал видео с YouTube, но на самом деле не очень много информации, как написать содержимое каталога в файле cache.php, но на самом деле это не указывало, можно ли это сделать с выходом JSON и, конечно же, не сказал, как использовать временной интервал 60 минут или как получить информацию, а затем вернуться из файла кеша.
Любая помощь или код будут очень оценены, поскольку, как представляется, в учебниках по этой вещи очень мало.
Здесь простая функция, которая добавляет кеширование для получения некоторого содержимого 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-адрес будет считываться из кеша в следующий раз. Он записывает временную метку в первую строку файла кэша, а кешированные данные старше часа отбрасываются. Это простой пример, и вы, вероятно, захотите его настроить.
Рекомендуется использовать кеширование, чтобы избежать ограничения скорости. Вот пример кода, который показывает, как я это сделал для данных Google+, в некотором php-коде, который я написал недавно.
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); }