Рубрики
Uncategorized

Анализ исходного кода кэша laravel

Автор оригинала: 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 Предоставлено Уровень сеанса Когда имя драйвера будет разрешено, оно будет разрешено в следующем порядке:

  1. Пользовательский драйвер: проверьте, прошел ли он CacheManager::расширение(...) Пользовательские драйверы
  2. Драйвер, предоставленный 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;
    }
}

Как вы можете видеть из исходного кода, Осветить\Кэш\Репозиторий Реализован режим агента, и конкретная реализация заключается в том, чтобы доверить Осветить\Контракты\Кэш\Хранилище Иметь дело с. Хранилище Основными функциями являются

  1. Обеспечьте некоторое удобное управление (это можно понимать как грамматический сахар)
  2. Событие запуск события, включая попадание/промах в кэш, запись/удаление значения ключа

Магазин

Драйвер кэша Illuminate\Contracts\Cache – это класс, который фактически обрабатывает запись/чтение/удаление кэша. Содержимое интерфейса выглядит следующим образом:

Конкретными классами реализации являются:

  • Appstore
  • Хранилище массивов
  • Нулевое хранилище
  • Хранилище базы данных
  • Хранилище файлов
  • MemcachedStore
  • RedisStore

Оригинал: “https://developpaper.com/cache-source-code-analysis-of-laravel/”