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