Подтвердить что ты не робот

Кэширование вывода JSON в PHP

Возникла небольшая проблема. Играя с API facebook и twitter и не получая JSON-вывод запросов поиска по статусу, нет проблем, однако я еще раз прочитал и понял, что могу оказаться "ограниченным по скорости", как указано в документации.

Мне было интересно, легко ли кэшировать выход JSON каждый час, чтобы я мог хотя бы попытаться предотвратить это? Если да, то как это делается? Поскольку я пробовал видео с YouTube, но на самом деле не очень много информации, как написать содержимое каталога в файле cache.php, но на самом деле это не указывало, можно ли это сделать с выходом JSON и, конечно же, не сказал, как использовать временной интервал 60 минут или как получить информацию, затем вернуться из файла кеша.

Любая помощь или код были бы очень оценены, поскольку, как представляется, в учебниках по этой вещи очень мало.

4b9b3361

Ответ 1

Вот простая функция, которая добавляет кеширование для получения содержимого 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-адрес будет считываться из кеша в следующий раз. Он записывает временную метку в первую строку файла кэша, а кешированные данные старше часа отбрасываются. Это простой пример, и вы, вероятно, захотите его настроить.

Ответ 2

Рекомендуется использовать кеширование, чтобы избежать ограничения скорости. Вот пример кода, который показывает, как я это сделал для данных 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);
        }