Автор оригинала: David Wong.
Последнее изменение: 14:17:34, 10 мая 2019
Laravel поддерживает множество систем кэширования и предоставляет единый интерфейс API
( laravel 5.5) драйверы хранилища, поддерживаемые по умолчанию, включают следующее:
- Файл (по умолчанию)
- бтр
- Массив (для тестирования)
- База данных (реляционная база данных)
- mem кэш d
- редис
Профиль кэша по умолчанию находится в кэше config/. php
Ссылка на ссылку:
- Ссылка на ссылку:
- Ссылка на ссылку:
Непосредственно используйте фасад, предоставленный laravel
use Illuminate\Support\Facades\Cache;
$cache = Cache::get('key');Большинство поддерживаемых методов:
Cache::put('key', 'value', $minutes);
Cache::add('key', 'value', $minutes);
Cache::forever('key', 'value');
Cache::remember('key', $minutes, function(){ return 'value' });
Cache::rememberForever('key', function(){ return 'value' });
Cache::forget('key');
Cache::has('key');
Cache::get('key');
Cache::get('key', 'default');
Cache::get('key', function(){ return 'default'; });
Cache::tags('my-tag')->put('key','value', $minutes);
Cache::tags('my-tag')->has('key');
Cache::tags('my-tag')->get('key');
Cache::tags('my-tag')->forget('key');
Cache::tags('my-tag')->flush();
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
Cache::tags('group')->put('key', $value);
Cache::tags('group')->get('key');
Cache::tags('group')->flush();Для другого использования, пожалуйста, обратитесь к официальному переводу (китайский) документа: Для другого использования, пожалуйста, обратитесь к официальному переводу (китайский) документа:
Фасад кэша часто используется для управления кэшем в laravel. Соответствующий фактический класс Осветить\Кэш\CacheManager Класс управления кэшем (заводской)
Кэш::xxx()
Мы прошли CacheManager Класс get содержит разные хранилища, управляемые Осветить\Кэш\Репозиторий класс
Менеджер кэша::магазин($имя)
Хранилище Агент класса хранилища реализует интерфейс драйвера хранилища Осветить\Контракты\Кэш\Хранилище Экземпляр класса
Фасад кэша
Во-первых, проанализируйте фасад кэша и посмотрите на его исходный код:
В профиле config\app.php Поставщик услуг кэширования, определенный в
//...
'providers' => [
// ......
Illuminate\Cache\CacheServiceProvider::class,
// ......
],
//...Осветить\Кэш\CacheServiceProvider Исходные файлы:
app->singleton('cache', function ($app) {
return new CacheManager($app);
});
$this->app->singleton('cache.store', function ($app) {
return $app['cache']->driver();
});
$this->app->singleton('memcached.connector', function () {
return new MemcachedConnector;
});
}
// ......
}Согласно приведенному выше исходному коду, элементами , связанными с фасадом кэша, являются Illuminate\Cache\CacheManager , то есть то, что мы на самом деле называем фасадом кэша, является CacheManager Метод экземпляра
CacheManager
CacheManager реализует Осветить\Контракты\Кэш\Фабрика Интерфейс (↑), то есть для реализации простой фабрики, передавая имя драйвера хранилища и возвращая соответствующий экземпляр драйвера
Простой метод заводского интерфейса, реализованный диспетчером кэша:
getDefaultDriver();
return $this->stores[$name] = $this->get($name);
}
/**
* Get the default cache driver name.
*
* @return string
*/
public function getDefaultDriver()
{
return $this->app['config']['cache.default'];
}
/**
* Attempt to get the store from the local cache.
*
* @param string $name
* @return \Illuminate\Contracts\Cache\Repository
*/
protected function get($name)
{
return $this->stores[$name] ?? $this->resolve($name);
}
/**
* Resolve the given store.
*
* @param string $name
* @return \Illuminate\Contracts\Cache\Repository
*
* @throws \InvalidArgumentException
*/
protected function resolve($name)
{
$config = $this->getConfig($name);
if (is_null($config)) {
throw new InvalidArgumentException("Cache store [{$name}] is not defined.");
}
if (isset($this->customCreators[$config['driver']])) {
return $this->callCustomCreator($config);
} else {
$driverMethod = 'create'.ucfirst($config['driver']).'Driver';
if (method_exists($this, $driverMethod)) {
return $this->{$driverMethod}($config);
} else {
throw new InvalidArgumentException("Driver [{$config['driver']}] is not supported.");
}
}
}
/**
* Dynamically call the default driver instance.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public function __call($method, $parameters)
{
return $this->store()->$method(...$parameters);
}
}Могу видеть CacheManager Предоставлено Уровень сеанса Когда имя драйвера будет разрешено, оно будет разрешено в следующем порядке:
- Пользовательский драйвер: проверьте, прошел ли он
CacheManager::расширение(...)Пользовательские драйверы - Драйвер, предоставленный Laravel: проверьте, существует ли он
Менеджер кэша::Драйвер createXxx(...)Метод
Экземпляры, возвращаемые этими методами, должны быть реализованы Осветить\Контракты\Кэш\Репозиторий Интерфейс
По сути, Менеджер кэша Только один Кэш на уровне сеанса Репозитория Фабрики экземпляров, которая предоставляет __вызов Волшебный метод для быстрого вызова драйвера кэша по умолчанию
$value = Cache::store('file')->get('foo');
//Call the get method driven by the default cache through \
$value = Cache::get('key');Хранилище
Осветить\Контракты\Кэш\Репозиторий Интерфейс
Репозиторий-это соответствие требованиям PSR -16: Общий интерфейс для Кэширование Спецификация класса хранилища кэша библиотек, класс его реализации в laravel: Осветить\Кэш\Репозиторий
Осветить\Кэш\Репозиторий Некоторые коды выглядят следующим образом:
store = $store;
}
public function has($key)
{
return ! is_null($this->get($key));
}
public function get($key, $default = null)
{
if (is_array($key)) {
return $this->many($key);
}
$value = $this->store->get($this->itemKey($key));
// If we could not find the cache value, we will fire the missed event and get
// the default value for this cache value. This default could be a callback
// so we will execute the value function which will resolve it if needed.
if (is_null($value)) {
$this->event(new CacheMissed($key));
$value = value($default);
} else {
$this->event(new CacheHit($key, $value));
}
return $value;
}
public function pull($key, $default = null)
{
return tap($this->get($key, $default), function ($value) use ($key) {
$this->forget($key);
});
}
protected function event($event)
{
if (isset($this->events)) {
$this->events->dispatch($event);
}
}
/**
* Set the event dispatcher instance.
*
* @param \Illuminate\Contracts\Events\Dispatcher $events
* @return void
*/
public function setEventDispatcher(Dispatcher $events)
{
$this->events = $events;
}
public function __call($method, $parameters)
{
if (static::hasMacro($method)) {
return $this->macroCall($method, $parameters);
}
return $this->store->$method(...$parameters);
}
public function __clone()
{
$this->store = clone $this->store;
}
}
Как вы можете видеть из исходного кода, Осветить\Кэш\Репозиторий Реализован режим агента, и конкретная реализация заключается в том, чтобы доверить Осветить\Контракты\Кэш\Хранилище Иметь дело с. Хранилище Основными функциями являются
- Обеспечьте некоторое удобное управление (это можно понимать как грамматический сахар)
- Событие запуск события, включая попадание/промах в кэш, запись/удаление значения ключа
Магазин
Драйвер кэша Illuminate\Contracts\Cache – это класс, который фактически обрабатывает запись/чтение/удаление кэша. Содержимое интерфейса выглядит следующим образом:
Конкретными классами реализации являются:
AppstoreХранилище массивовНулевое хранилищеХранилище базы данныхХранилище файловMemcachedStoreRedisStore
Оригинал: “https://developpaper.com/cache-source-code-analysis-of-laravel/”