Я использую 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;
Это возможно? Благодарю.
Вам нужно написать или загрузить библиотеку кэширования 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