Laravel中怎么缓存源码
这期内容当中小编将会给大家带来有关Laravel 中怎么缓存源码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
10年积累的成都网站设计、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计制作后付款的网站建设流程,更有甘井子免费网站建设让你可以放心的选择与我们合作。
使用
直接使用Laravel为我们提供的Facade
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();
其他使用方法请参照官方翻译(中文)文档: https://learnku.com/docs/lara...
源码
Laravel 中常用 Cache Facade 来操作缓存, 对应的实际类是 Illuminate\Cache\CacheManager
缓存管理类(工厂).
Cache::xxx()
我们通过 CacheManager
类获取持有不同存储驱动的 Illuminate\Cache\Repository
类
CacheManager::store($name = null)
Repository
仓库类代理了实现存储驱动接口 Illuminate\Contracts\Cache\Store
的类实例.
Cache Facade
首先从 Cache Facade 开始分析, 先看一下其源码:
在配置文件
config\app.php
中定义了 Cache 服务提供者//... 'providers' => [ // ...... Illuminate\Cache\CacheServiceProvider::class, // ...... ], //...
Illuminate\Cache\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; }); } // ...... }通过上面源码可知, Cache Facade 关联的项是
Illuminate\Cache\CacheManager
, 也就是我们通过 Cache Facade 实际调用的是CacheManager
实例的方法.CacheManager
CacheManager 实现了
Illuminate\Contracts\Cache\Factory
接口(↑), 即实现了一个简单工厂, 传入存储驱动名, 返回对应的驱动实例.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::extend(...)
自定义的驱动Laravel提供的驱动: 查看是否存在
CacheManager::createXxxDriver(...)
方法这些方法返回的实例必须是实现了
Illuminate\Contracts\Cache\Repository
接口本质上,
CacheManager
就是一个提供了会话级别缓存的Repository
实例工厂, 同时它提供了一个__call
魔术方法, 以便快速调用默认缓存驱动.$value = Cache::store('file')->get('foo'); // 通过 _call, 调用默认缓存驱动的 get 方法 $value = Cache::get('key');Repository
Illuminate\Contracts\Cache\Repository
接口Repository 是一个符合 href="http://www.baidu.com/link?url=9LkUzilH74QMr6SuXLs5wqzeJAXlxKxOoz7qJLQSMmy8JHcYUiJj_wtVBslGK2dB">PSR-16: Common Interface for Caching Libraries 规范的缓存仓库类, 其在Laravel相应的实现类:
Illuminate\Cache\Repository
Illuminate\Cache\Repository
部分代码如下: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\Cache\Repository
实现了代理模式, 具体的实现是交由Illuminate\Contracts\Cache\Store
来处理,Repository
主要作用是
提供一些便捷操作(可以理解为语法糖)
Event 事件触发, 包括缓存命中/未命中、写入/删除键值
Store
Illuminate\Contracts\Cache
缓存驱动是实际处理缓存如何写入/读取/删除的类, 接口内容如下:上述就是小编为大家分享的Laravel 中怎么缓存源码了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。
分享文章:Laravel中怎么缓存源码
URL网址:http://scyanting.com/article/iecigc.html