Кэш с использованием 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; 

Это возможно? Благодарю.

Solutions Collecting From Web of "Кэш с использованием PHP cURL"

Вам нужно написать или загрузить библиотеку кэширования 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 } 

Предложение Хонзы использовать кеш 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 Cache . Все, что вам нужно для решения, прост в использовании и, конечно же, потокобезопасным.

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

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

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

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

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