Кэширование с использованием PHP cURL - PullRequest
9 голосов
/ 12 февраля 2011

Я использую 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 ]

7 голосов
/ 12 февраля 2011

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

Допустим, вашВ библиотеке кеша есть две функции:

save_cache($result, $cache_key, $timestamp)

и

get_cache($cache_key, $timestamp)

С помощью save_cache() вы сохраните результат $ в кеш, а с помощью 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;
3 голосов
/ 12 февраля 2011

Вы можете кэшировать его, используя 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
 }
1 голос
/ 20 февраля 2015

Предложение Хонзы использовать Кэш 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;
}
1 голос
/ 02 апреля 2011

Использование Nette Cache . Все, что вам нужно, решение простое в использовании и, конечно, поточно-ориентированное.

0 голосов
/ 14 января 2015

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

так, например, вместо
http://example.com/content.php
у вас будет
http://example.com/content.php?ts=1212434353

0 голосов
/ 12 февраля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...