摘要:年月日前言支持多種緩存系統并提供了統一的接口默認支持的存儲驅動包括如下默認使用數組測試用關系型數據庫默認的緩存配置文件在參考鏈接使用直接使用為我們提供的支持的大部分方法其他使用方法請參照官方翻譯中文文檔源碼中常用
Last-Modified: 2019年5月10日14:17:34
前言Laravel 支持多種緩存系統, 并提供了統一的api接口.
(Laravel 5.5)默認支持的存儲驅動包括如下:
file (默認使用)
apc
array (數組, 測試用)
database (關系型數據庫)
memcached
redis
默認的緩存配置文件在 config/cache.php
參考鏈接:
https://learnku.com/docs/lara...
https://www.jianshu.com/p/46a...
使用直接使用Laravel為我們提供的Facade
use IlluminateSupportFacadesCache; $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 來操作緩存, 對應的實際類是 IlluminateCacheCacheManager 緩存管理類(工廠).
Cache::xxx()
我們通過 CacheManager 類獲取持有不同存儲驅動的 IlluminateCacheRepository 類
CacheManager::store($name = null)
Repository 倉庫類代理了實現存儲驅動接口 IlluminateContractsCacheStore 的類實例.
Cache Facade首先從 Cache Facade 開始分析, 先看一下其源碼:
在配置文件 configapp.php 中定義了 Cache 服務提供者
//... "providers" => [ // ...... IlluminateCacheCacheServiceProvider::class, // ...... ], //...IlluminateCacheCacheServiceProvider 源文件:
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 關聯的項是 IlluminateCacheCacheManager, 也就是我們通過 Cache Facade 實際調用的是 CacheManager實例的方法.
CacheManagerCacheManager 實現了 IlluminateContractsCacheFactory 接口(↑), 即實現了一個簡單工廠, 傳入存儲驅動名, 返回對應的驅動實例.
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 IlluminateContractsCacheRepository */ protected function get($name) { return $this->stores[$name] ?? $this->resolve($name); } /** * Resolve the given store. * * @param string $name * @return IlluminateContractsCacheRepository * * @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(...)方法
這些方法返回的實例必須是實現了 IlluminateContractsCacheRepository 接口
本質上, CacheManager 就是一個提供了會話級別緩存的 Repository 實例工廠, 同時它提供了一個 __call 魔術方法, 以便快速調用默認緩存驅動.
$value = Cache::store("file")->get("foo"); // 通過 _call, 調用默認緩存驅動的 get 方法 $value = Cache::get("key");RepositoryIlluminateContractsCacheRepository 接口
Repository 是一個符合 PSR-16: Common Interface for Caching Libraries 規范的緩存倉庫類, 其在Laravel相應的實現類: IlluminateCacheRepository
IlluminateCacheRepository 部分代碼如下:
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 IlluminateContractsEventsDispatcher $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; } }從源碼可以看出, IlluminateCacheRepository 實現了代理模式, 具體的實現是交由 IlluminateContractsCacheStore 來處理, Repository 主要作用是
提供一些便捷操作(可以理解為語法糖)
Event 事件觸發, 包括緩存命中/未命中、寫入/刪除鍵值
StoreIlluminateContractsCache 緩存驅動是實際處理緩存如何寫入/讀取/刪除的類, 接口內容如下:
具體的實現類有:
ApcStore
ArrayStore
NullStore
DatabaseStore
FileStore
MemcachedStore
RedisStore
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/62106.html
摘要:年月日前言支持多種緩存系統并提供了統一的接口默認支持的存儲驅動包括如下默認使用數組測試用關系型數據庫默認的緩存配置文件在參考鏈接使用直接使用為我們提供的支持的大部分方法其他使用方法請參照官方翻譯中文文檔源碼中常用 Last-Modified: 2019年5月10日14:17:34 前言 Laravel 支持多種緩存系統, 并提供了統一的api接口. (Laravel 5.5)默認支持的...
摘要:總結本文主要學習了啟動時做的七步準備工作環境檢測配置加載日志配置異常處理注冊注冊啟動。 說明:Laravel在把Request通過管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動Bootstrap工作,本文主要學習相關源碼,看看Laravel啟動程序做了哪些具體工作,并將個人的研究心得分享出來,希望對別人有所幫助。Laravel在入口index...
摘要:源碼解析這個類的源碼主要就是文件的操作和文件屬性的操作,而具體的操作是通過每一個實現的,看其構造函數看以上代碼知道對于操作,實際上是通過的實例來實現的。可以看下的使用上文已經說了,使得對各種的操作變得更方便了,不管是還是得。 說明:本文主要學習下LeagueFlysystem這個Filesystem Abstract Layer,學習下這個package的設計思想和編碼技巧,把自己的一...
摘要:容器主要的作用就是生產各種零件,就是提供各個服務。的原理我們以為例,來講解一下門面的原理與實現。當運行時,發現門面沒有靜態函數,就會調用這個魔術函數。我們看到這個魔術函數做了兩件事獲得對象實例,利用對象調用函數。 前言 在開始之前,歡迎關注我自己的博客:www.leoyang90.cn這篇文章我們開始講 laravel 框架中的門面 Facade,什么是門面呢?官方文檔: Facade...
摘要:調用了的可以看出,所有服務提供器都在配置文件文件的數組中。啟動的啟動由類負責引導應用的屬性中記錄的所有服務提供器,就是依次調用這些服務提供器的方法,引導完成后就代表應用正式啟動了,可以開始處理請求了。 服務提供器是所有 Laravel 應用程序引導中心。你的應用程序自定義的服務、第三方資源包提供的服務以及 Laravel 的所有核心服務都是通過服務提供器進行注冊(register)和引...
閱讀 2618·2021-09-28 09:36
閱讀 2228·2021-09-07 09:58
閱讀 1494·2019-08-26 13:53
閱讀 1275·2019-08-23 17:53
閱讀 3023·2019-08-23 15:34
閱讀 1850·2019-08-23 15:34
閱讀 2864·2019-08-23 12:04
閱讀 3717·2019-08-23 10:56