Кэш с использованием PHP cURL

Я использую PHP cURL для извлечения информации с другого веб-сайта и вставки ее на мою страницу. Мне было интересно, можно ли кэшировать полученную информацию на моем сервере? Например, когда посетитель запрашивает страницу, данные извлекаются и кэшируются на моем сервере в течение 24 часов. Страницы полностью подается локально в течение 24 часов. Когда истекают 24 часа, информация снова извлекается и кэшируется, когда другой посетитель запрашивает ее таким же образом.

в кода я в настоящее время использую для получения информации выглядит следующим образом:

$url = $fullURL;
$ch = curl_init();    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_URL, $url); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result;

это возможно? Спасибо.

6 ответов


вам нужно написать или загрузить библиотеку кэширования php (например,расширяемая библиотека кэширования php или такой) и настроить ваш текущий код, чтобы сначала взглянуть на кэш.

предположим, что ваша библиотека кэша имеет 2 функции, называемые:

save_cache($result, $cache_key, $timestamp)

и

get_cache($cache_key, $timestamp)

С save_cache() вы сохраните $result в кэше и с get_cache() вы получите данные.

$cache_key будет md5($fullURL), уникальный идентификатор кэширование библиотеки, чтобы узнать, что вы хотите получить.

$timestamp - это количество минут / часов, которое вы хотите, чтобы Кэш был действительным, в зависимости от того, что принимает ваша библиотека кэширования.

теперь на вашем коде вы можете иметь логику, как:

$cache_key = md5($fullURL);
$timestamp = 24 // assuming your caching library accept hours as timestamp

$result = get_cache($cache_key, $timestamp); 
if(!result){
   echo "This url is NOT cached, let's get it and cache it";
  // do the curl and get $result
  // save the cache:
  save_cache($result, $cache_key, $timestamp);
}
else {
  echo "This url is cached";
}
echo $result;

вы можете кэшировать его с помощью memcache (сеанс) вы можете кэшировать его с помощью файлов на вашем сервере, и вы можете кэшировать его с помощью базы данных, как mySQL.

file_put_contents("cache/cachedata.txt",$data);

вам нужно будет установить разрешения папки, в которую вы хотите записать файлы, иначе вы можете получить некоторые ошибки.

затем, если вы хотите прочитать из кэша:

if( file_exists("cache/cachedata.txt") )
{ $data = file_get_contents("cache/cachedate.txt"); }
else
{ // curl here, we have no cache
 }

предложение Honza использовать кэш Nette работал большой для меня, и вот код, который я написал, чтобы использовать его. Моя функция возвращает результат HTTP, если он работал, false, если нет. Вам придется изменить некоторые строки пути.

use Nette\Caching\Cache;
use Nette\Caching\Storages\FileStorage;
Require("/Nette/loader.php");

function cached_httpGet($url) {
    $storage = new FileStorage("/nette-cache");
    $cache = new Cache($storage);
    $result = $cache->load($url);
    if ($result) {
        echo "Cached: $url";
    }
    else {
        echo "Fetching: $url";
        $ch = curl_init();    
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_URL, $url); 
        $result = curl_exec($ch); 
        if (curl_errno($ch)) {
            echo "ERROR " .  curl_error($ch) . " loading: $url";
            return false;
        } else
            $cache->save($url, $result, array(Cache::EXPIRE => '1 day'));
        curl_close($ch); 
    }
    return $result;
}

использовать Кэш Nette. Все, что вам нужно решение, простое в использовании и, конечно же, потокобезопасное.


Если у вас нет ничего против доступа к файловой системе, вы можете просто сохранить его в файл. Тогда может использовать скрипт на сервере, который проверяет метку времени файла на текущее время, и удаляет его, если он слишком старый.

Если у вас нет доступа ко всем аспектам сервера, вы можете просто использовать вышеуказанную идею и сохранить временную метку с информацией. Каждый раз, когда страница запрашивается, проверьте отметку времени.

и если у вас возникли проблемы с ФС узкое место, вы можете использовать базу данных MySQL, хранящуюся полностью в ОЗУ.


лучший способ избежать кэширования-это применить время или любой другой случайный элемент к url-адресу, например:
$url .= '?ts=' . time();

Так, например, вместо
http://example.com/content.php
ты бы ... --4-->http://example.com/content.php?ts=1212434353