跳轉至內容

快取

簡介

應用程式執行的一些資料檢索或處理任務可能是 CPU 密集型的,或者需要幾秒鐘才能完成。在這種情況下,通常會將檢索到的資料快取一段時間,以便在後續請求相同資料時能夠快速獲取。快取的資料通常儲存在非常快速的資料儲存中,例如 MemcachedRedis

值得慶幸的是,Laravel 為各種快取後端提供了一個富有表現力、統一的 API,讓您可以利用它們極快的資料檢索速度來加速您的 Web 應用程式。

配置

應用程式的快取配置檔案位於 config/cache.php。在此檔案中,您可以指定預設情況下在整個應用程式中使用的快取儲存。Laravel 開箱即用地支援流行的快取後端,如 MemcachedRedisDynamoDB 和關係資料庫。此外,還提供基於檔案的快取驅動,而 arraynull 快取驅動則為您的自動化測試提供了便捷的快取後端。

快取配置檔案還包含許多其他選項,您可以檢視。預設情況下,Laravel 配置為使用 database 快取驅動,該驅動將序列化後的快取物件儲存在您的應用程式資料庫中。

驅動前提條件

資料庫

當使用 database 快取驅動時,您需要一個數據庫表來容納快取資料。通常,這包含在 Laravel 預設的 0001_01_01_000001_create_cache_table.php 資料庫遷移中;但是,如果您的應用程式不包含此遷移,您可以使用 make:cache-table Artisan 命令來建立它。

1php artisan make:cache-table
2 
3php artisan migrate

Memcached

使用 Memcached 驅動需要安裝 Memcached PECL 擴充套件包。您可以在 config/cache.php 配置檔案中列出所有的 Memcached 伺服器。該檔案已經包含了一個 memcached.servers 條目,供您快速上手。

1'memcached' => [
2 // ...
3 
4 'servers' => [
5 [
6 'host' => env('MEMCACHED_HOST', '127.0.0.1'),
7 'port' => env('MEMCACHED_PORT', 11211),
8 'weight' => 100,
9 ],
10 ],
11],

如果需要,您可以將 host 選項設定為 UNIX 套接字路徑。如果這樣做,port 選項應設定為 0

1'memcached' => [
2 // ...
3 
4 'servers' => [
5 [
6 'host' => '/var/run/memcached/memcached.sock',
7 'port' => 0,
8 'weight' => 100
9 ],
10 ],
11],

Redis

在 Laravel 中使用 Redis 快取之前,您需要透過 PECL 安裝 PhpRedis PHP 擴充套件,或者透過 Composer 安裝 predis/predis 包 (~2.0)。Laravel Sail 已經包含了此擴充套件。此外,諸如 Laravel CloudLaravel Forge 等官方 Laravel 應用程式平臺預設已安裝 PhpRedis 擴充套件。

有關配置 Redis 的更多資訊,請查閱其 Laravel 文件頁面

DynamoDB

在使用 DynamoDB 快取驅動之前,您必須建立一個 DynamoDB 表來儲存所有快取資料。通常,此表應命名為 cache。但是,您應該根據 cache 配置檔案中 stores.dynamodb.table 配置值來命名該表。表名也可以透過 DYNAMODB_CACHE_TABLE 環境變數進行設定。

此表還應具有一個字串分割槽鍵,其名稱應與應用程式 cache 配置檔案中 stores.dynamodb.attributes.key 配置項的值相對應。預設情況下,分割槽鍵應命名為 key

通常,DynamoDB 不會主動從表中刪除過期專案。因此,您應該在表上啟用生存時間 (TTL)。在配置表的 TTL 設定時,應將 TTL 屬性名稱設定為 expires_at

接下來,安裝 AWS SDK,以便您的 Laravel 應用程式可以與 DynamoDB 通訊。

1composer require aws/aws-sdk-php

此外,您應該確保為 DynamoDB 快取儲存配置選項提供了值。通常,這些選項(如 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)應在應用程式的 .env 配置檔案中定義。

1'dynamodb' => [
2 'driver' => 'dynamodb',
3 'key' => env('AWS_ACCESS_KEY_ID'),
4 'secret' => env('AWS_SECRET_ACCESS_KEY'),
5 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
6 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
7 'endpoint' => env('DYNAMODB_ENDPOINT'),
8],

MongoDB

如果您正在使用 MongoDB,官方的 mongodb/laravel-mongodb 包提供了一個 mongodb 快取驅動,並且可以使用 mongodb 資料庫連線進行配置。MongoDB 支援 TTL 索引,可用於自動清理過期的快取專案。

有關配置 MongoDB 的更多資訊,請參考 MongoDB 的快取與鎖文件

快取使用

獲取快取例項

要獲取快取儲存例項,您可以使用 Cache 門面 (Facade),這也是我們在本整個文件中將使用的內容。Cache 門面為 Laravel 快取契約的底層實現提供了便捷、簡潔的訪問方式。

1<?php
2 
3namespace App\Http\Controllers;
4 
5use Illuminate\Support\Facades\Cache;
6 
7class UserController extends Controller
8{
9 /**
10 * Show a list of all users of the application.
11 */
12 public function index(): array
13 {
14 $value = Cache::get('key');
15 
16 return [
17 // ...
18 ];
19 }
20}

訪問多個快取儲存

使用 Cache 門面,您可以透過 store 方法訪問各種快取儲存。傳遞給 store 方法的鍵應與 cache 配置檔案中 stores 陣列中列出的儲存之一相對應。

1$value = Cache::store('file')->get('foo');
2 
3Cache::store('redis')->put('bar', 'baz', 600); // 10 Minutes

從快取中獲取專案

Cache 門面的 get 方法用於從快取中檢索專案。如果專案在快取中不存在,將返回 null。如果您願意,可以向 get 方法傳遞第二個引數,指定在專案不存在時希望返回的預設值。

1$value = Cache::get('key');
2 
3$value = Cache::get('key', 'default');

您甚至可以傳遞一個閉包作為預設值。如果指定的專案在快取中不存在,則返回閉包的結果。傳遞閉包允許您推遲從資料庫或其他外部服務檢索預設值的操作。

1$value = Cache::get('key', function () {
2 return DB::table(/* ... */)->get();
3});

判斷專案是否存在

has 方法可用於確定快取中是否存在某個專案。如果專案存在但其值為 null,該方法也會返回 false

1if (Cache::has('key')) {
2 // ...
3}

遞增/遞減值

incrementdecrement 方法可用於調整快取中整數專案的值。這兩個方法都接受一個可選的第二個引數,指示增加或減少專案值的數量。

1// Initialize the value if it does not exist...
2Cache::add('key', 0, now()->plus(hours: 4));
3 
4// Increment or decrement the value...
5Cache::increment('key');
6Cache::increment('key', $amount);
7Cache::decrement('key');
8Cache::decrement('key', $amount);

檢索並存儲

有時您可能希望從快取中檢索一個專案,但如果請求的專案不存在,也想儲存一個預設值。例如,您可能希望從快取中檢索所有使用者,或者如果它們不存在,則從資料庫中檢索它們並將它們新增到快取中。您可以使用 Cache::remember 方法執行此操作。

1$value = Cache::remember('users', $seconds, function () {
2 return DB::table('users')->get();
3});

如果專案在快取中不存在,將執行傳遞給 remember 方法的閉包,其結果將被放入快取中。

您可以使用 rememberForever 方法從快取中檢索專案,如果它不存在,則將其永久儲存。

1$value = Cache::rememberForever('users', function () {
2 return DB::table('users')->get();
3});

舊值重驗證 (Stale While Revalidate)

當使用 Cache::remember 方法時,如果快取值已過期,某些使用者可能會遇到響應緩慢的情況。對於某些型別的資料,允許在後臺重新計算快取值的同時提供部分舊資料是有用的,這可以防止部分使用者在計算快取值時遇到緩慢的響應。這通常被稱為“舊值重驗證 (stale-while-revalidate)”模式,Cache::flexible 方法提供了此模式的實現。

flexible 方法接受一個數組,該陣列指定快取值被視為“新鮮 (fresh)”的時間以及它何時變為“陳舊 (stale)”。陣列中的第一個值表示快取被視為新鮮的秒數,而第二個值定義了在需要重新計算之前,它作為陳舊資料可以被提供多久。

如果在新鮮期內(第一個值之前)發出請求,快取會立即返回,無需重新計算。如果在陳舊期內(兩個值之間)發出請求,則向用戶提供舊值,並註冊一個延遲函式,以便在響應傳送給使用者後重新整理快取值。如果請求是在第二個值之後發出的,則快取被視為已過期,值會立即重新計算,這可能會導致使用者的響應變慢。

1$value = Cache::flexible('users', [5, 10], function () {
2 return DB::table('users')->get();
3});

檢索並刪除

如果您需要從快取中檢索一個專案然後刪除它,可以使用 pull 方法。與 get 方法一樣,如果專案在快取中不存在,將返回 null

1$value = Cache::pull('key');
2 
3$value = Cache::pull('key', 'default');

在快取中儲存專案

您可以使用 Cache 門面上的 put 方法在快取中儲存專案。

1Cache::put('key', 'value', $seconds = 10);

如果沒有將儲存時間傳遞給 put 方法,該專案將無限期儲存。

1Cache::put('key', 'value');

除了將秒數作為整數傳遞外,您還可以傳遞一個 DateTime 例項,表示快取專案所需的過期時間。

1Cache::put('key', 'value', now()->plus(minutes: 10));

不存在時儲存

add 方法僅在快取儲存中尚不存在該專案時才會將其新增到快取中。如果專案確實已新增到快取中,該方法將返回 true。否則,該方法將返回 falseadd 方法是一個原子操作。

1Cache::add('key', 'value', $seconds);

延長專案有效期

touch 方法允許您延長現有快取專案的壽命 (TTL)。如果快取專案存在且其過期時間成功延長,touch 方法將返回 true。如果專案在快取中不存在,該方法將返回 false

1Cache::touch('key', 3600);

您可以提供 DateTimeInterfaceDateIntervalCarbon 例項來指定精確的過期時間。

1Cache::touch('key', now()->addHours(2));

永久儲存專案

forever 方法可用於將專案永久儲存在快取中。由於這些專案不會過期,因此必須使用 forget 方法手動從快取中刪除它們。

1Cache::forever('key', 'value');

如果您使用的是 Memcached 驅動,當快取達到其大小限制時,可能會刪除“永久”儲存的專案。

從快取中刪除專案

您可以使用 forget 方法從快取中刪除專案。

1Cache::forget('key');

您也可以透過提供零或負數的過期秒數來刪除專案。

1Cache::put('key', 'value', 0);
2 
3Cache::put('key', 'value', -5);

您可以使用 flush 方法清除整個快取。

1Cache::flush();

您可以使用 flushLocks 方法清除快取中的所有原子鎖。

1Cache::flushLocks();

重新整理快取不會考慮您配置的快取“字首”,並將刪除快取中的所有條目。在清除與其他應用程式共享的快取時,請慎重考慮。

快取記憶化 (Cache Memoization)

Laravel 的 memo 快取驅動允許您在單個請求或作業執行期間臨時將已解析的快取值儲存在記憶體中。這可以防止在同一執行過程中重複命中快取,從而顯著提高效能。

要使用記憶化快取,請呼叫 memo 方法。

1use Illuminate\Support\Facades\Cache;
2 
3$value = Cache::memo()->get('key');

memo 方法可選地接受快取儲存的名稱,該名稱指定記憶化驅動將裝飾的底層快取儲存。

1// Using the default cache store...
2$value = Cache::memo()->get('key');
3 
4// Using the Redis cache store...
5$value = Cache::memo('redis')->get('key');

對於給定的鍵,第一次 get 呼叫會從您的快取儲存中檢索值,但同一請求或作業中的後續呼叫將從記憶體中檢索該值。

1// Hits the cache...
2$value = Cache::memo()->get('key');
3 
4// Does not hit the cache, returns memoized value...
5$value = Cache::memo()->get('key');

當呼叫修改快取值的方法(如 putincrementremember 等)時,記憶化快取會自動忘記記憶化的值,並將修改方法呼叫委託給底層的快取儲存。

1Cache::memo()->put('name', 'Taylor'); // Writes to underlying cache...
2Cache::memo()->get('name'); // Hits underlying cache...
3Cache::memo()->get('name'); // Memoized, does not hit cache...
4 
5Cache::memo()->put('name', 'Tim'); // Forgets memoized value, writes new value...
6Cache::memo()->get('name'); // Hits underlying cache again...

快取輔助函式

除了使用 Cache 門面外,您還可以使用全域性 cache 函式透過快取檢索和儲存資料。當呼叫帶有單個字串引數的 cache 函式時,它將返回給定鍵的值。

1$value = cache('key');

如果您向該函式提供鍵/值對陣列和過期時間,它將把值儲存在快取中指定的持續時間。

1cache(['key' => 'value'], $seconds);
2 
3cache(['key' => 'value'], now()->plus(minutes: 10));

當在沒有任何引數的情況下呼叫 cache 函式時,它會返回 Illuminate\Contracts\Cache\Factory 實現的一個例項,允許您呼叫其他快取方法。

1cache()->remember('users', $seconds, function () {
2 return DB::table('users')->get();
3});

在測試對全域性 cache 函式的呼叫時,您可以像測試門面一樣使用 Cache::shouldReceive 方法。

快取標籤

當使用 filedynamodbdatabase 快取驅動時,不支援快取標籤。

儲存標記的快取專案

快取標籤允許您標記快取中的相關專案,然後重新整理所有已分配給定標籤的快取值。您可以透過傳入有序的標籤名稱陣列來訪問標記的快取。例如,讓我們訪問標記的快取並將一個值 put 到快取中。

1use Illuminate\Support\Facades\Cache;
2 
3Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
4Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);

訪問標記的快取專案

透過標籤儲存的專案如果不提供用於儲存該值的標籤,則無法訪問。要檢索標記的快取專案,請將相同的有序標籤列表傳遞給 tags 方法,然後使用您希望檢索的鍵呼叫 get 方法。

1$john = Cache::tags(['people', 'artists'])->get('John');
2 
3$anne = Cache::tags(['people', 'authors'])->get('Anne');

移除標記的快取專案

您可以重新整理分配了標籤或標籤列表的所有專案。例如,以下程式碼將刪除所有標記為 peopleauthors 或兩者的快取。因此,AnneJohn 都將從快取中刪除。

1Cache::tags(['people', 'authors'])->flush();

相反,下面的程式碼將只刪除標記為 authors 的快取值,因此 Anne 會被刪除,但 John 不會。

1Cache::tags('authors')->flush();

原子鎖

要使用此功能,您的應用程式必須使用 memcachedredisdynamodbdatabasefilearray 快取驅動作為應用程式的預設快取驅動。此外,所有伺服器必須與同一個中央快取伺服器通訊。

管理鎖

原子鎖允許在不擔心競爭條件的情況下操作分散式鎖。例如,Laravel Cloud 使用原子鎖來確保伺服器上一次只執行一個遠端任務。您可以使用 Cache::lock 方法建立和管理鎖。

1use Illuminate\Support\Facades\Cache;
2 
3$lock = Cache::lock('foo', 10);
4 
5if ($lock->get()) {
6 // Lock acquired for 10 seconds...
7 
8 $lock->release();
9}

get 方法也接受一個閉包。執行閉包後,Laravel 將自動釋放鎖。

1Cache::lock('foo', 10)->get(function () {
2 // Lock acquired for 10 seconds and automatically released...
3});

如果鎖在您請求時不可用,您可以指示 Laravel 等待指定的秒數。如果無法在指定的時間限制內獲得鎖,將丟擲 Illuminate\Contracts\Cache\LockTimeoutException 異常。

1use Illuminate\Contracts\Cache\LockTimeoutException;
2 
3$lock = Cache::lock('foo', 10);
4 
5try {
6 $lock->block(5);
7 
8 // Lock acquired after waiting a maximum of 5 seconds...
9} catch (LockTimeoutException $e) {
10 // Unable to acquire lock...
11} finally {
12 $lock->release();
13}

上面的示例可以透過將閉包傳遞給 block 方法來簡化。當將閉包傳遞給此方法時,Laravel 將嘗試在指定的秒數內獲取鎖,並在閉包執行後自動釋放鎖。

1Cache::lock('foo', 10)->block(5, function () {
2 // Lock acquired for 10 seconds after waiting a maximum of 5 seconds...
3});

跨程序管理鎖

有時,您可能希望在一個程序中獲取鎖並在另一個程序中釋放它。例如,您可能在 Web 請求期間獲取鎖,並希望在由該請求觸發的排隊作業結束時釋放該鎖。在這種情況下,您應該將鎖的作用域“所有者令牌 (owner token)”傳遞給排隊作業,以便作業可以使用給定的令牌重新例項化鎖。

在下面的示例中,如果成功獲取了鎖,我們將排程一個排隊作業。此外,我們將透過鎖的 owner 方法將鎖的所有者令牌傳遞給排隊作業。

1$podcast = Podcast::find($id);
2 
3$lock = Cache::lock('processing', 120);
4 
5if ($lock->get()) {
6 ProcessPodcast::dispatch($podcast, $lock->owner());
7}

在應用程式的 ProcessPodcast 作業中,我們可以使用所有者令牌恢復並釋放鎖。

1Cache::restoreLock('processing', $this->owner)->release();

如果您想在不考慮其當前所有者的情況下釋放鎖,可以使用 forceRelease 方法。

1Cache::lock('processing')->forceRelease();

併發限制

Laravel 的原子鎖功能還提供了一些限制閉包併發執行的方法。當您希望在整個基礎設施中只允許一個正在執行的例項時,請使用 withoutOverlapping

1Cache::withoutOverlapping('foo', function () {
2 // Lock acquired after waiting a maximum of 10 seconds...
3});

預設情況下,鎖會一直保持到閉包執行完成,並且該方法最多等待 10 秒來獲取鎖。您可以使用附加引數自定義這些值。

1Cache::withoutOverlapping('foo', function () {
2 // Lock acquired for 120 seconds after waiting a maximum of 5 seconds...
3}, lockFor: 120, waitFor: 5);

如果無法在指定的等待時間內獲得鎖,將丟擲 Illuminate\Contracts\Cache\LockTimeoutException 異常。

如果您想要受控的並行性,請使用 funnel 方法設定最大併發執行數。funnel 方法適用於任何支援鎖的快取驅動。

1Cache::funnel('foo')
2 ->limit(3)
3 ->releaseAfter(60)
4 ->block(10)
5 ->then(function () {
6 // Concurrency lock acquired...
7 }, function () {
8 // Could not acquire concurrency lock...
9 });

funnel 鍵標識正在被限制的資源。limit 方法定義最大併發執行數。releaseAfter 方法設定在自動釋放已獲取槽位之前的安全超時(秒)。block 方法設定等待可用槽位的秒數。

如果您更喜歡透過異常處理超時,而不是提供失敗閉包,則可以省略第二個閉包。如果無法在指定的等待時間內獲得鎖,將丟擲 Illuminate\Cache\Limiters\LimiterTimeoutException 異常。

1use Illuminate\Cache\Limiters\LimiterTimeoutException;
2 
3try {
4 Cache::funnel('foo')
5 ->limit(3)
6 ->releaseAfter(60)
7 ->block(10)
8 ->then(function () {
9 // Concurrency lock acquired...
10 });
11} catch (LimiterTimeoutException $e) {
12 // Unable to acquire concurrency lock...
13}

如果您想為併發限制器使用特定的快取儲存,可以在所需的儲存上呼叫 funnel 方法。

1Cache::store('redis')->funnel('foo')
2 ->limit(3)
3 ->block(10)
4 ->then(function () {
5 // Concurrency lock acquired using the "redis" store...
6 });

funnel 方法要求快取儲存實現 Illuminate\Contracts\Cache\LockProvider 介面。如果您嘗試在不支援鎖的快取儲存上使用 funnel,將丟擲 BadMethodCallException 異常。

快取故障轉移 (Cache Failover)

failover 快取驅動在與快取互動時提供自動故障轉移功能。如果 failover 儲存的主快取儲存由於任何原因失敗,Laravel 將自動嘗試使用列表中配置的下一個儲存。這對於確保在快取可靠性至關重要的生產環境中實現高可用性特別有用。

要配置故障轉移快取儲存,請指定 failover 驅動並提供按順序嘗試的儲存名稱陣列。預設情況下,Laravel 在您應用程式的 config/cache.php 配置檔案中包含了一個故障轉移配置示例。

1'failover' => [
2 'driver' => 'failover',
3 'stores' => [
4 'database',
5 'array',
6 ],
7],

配置好使用 failover 驅動的儲存後,您需要將故障轉移儲存設定為應用程式 .env 檔案中的預設快取儲存,以利用故障轉移功能。

1CACHE_STORE=failover

當快取儲存操作失敗且故障轉移被啟用時,Laravel 將觸發 Illuminate\Cache\Events\CacheFailedOver 事件,讓您能夠報告或記錄快取儲存已失敗。

新增自定義快取驅動

編寫驅動

要建立自定義快取驅動,我們首先需要實現 Illuminate\Contracts\Cache\Store 契約。因此,MongoDB 快取實現可能看起來像這樣:

1<?php
2 
3namespace App\Extensions;
4 
5use Illuminate\Contracts\Cache\Store;
6 
7class MongoStore implements Store
8{
9 public function get($key) {}
10 public function many(array $keys) {}
11 public function put($key, $value, $seconds) {}
12 public function putMany(array $values, $seconds) {}
13 public function increment($key, $value = 1) {}
14 public function decrement($key, $value = 1) {}
15 public function forever($key, $value) {}
16 public function forget($key) {}
17 public function flush() {}
18 public function getPrefix() {}
19}

我們只需要使用 MongoDB 連線實現這些方法中的每一個。有關如何實現這些方法中每一個的示例,請檢視 Laravel 框架原始碼中的 Illuminate\Cache\MemcachedStore。實現完成後,我們可以透過呼叫 Cache 門面的 extend 方法來完成自定義驅動的註冊。

1Cache::extend('mongo', function (Application $app) {
2 return Cache::repository(new MongoStore);
3});

如果您想知道將自定義快取驅動程式碼放在哪裡,可以在 app 目錄下建立一個 Extensions 名稱空間。但是,請記住 Laravel 沒有嚴格的應用程式結構,您可以根據自己的偏好組織應用程式。

註冊驅動

要向 Laravel 註冊自定義快取驅動,我們將使用 Cache 門面上的 extend 方法。由於其他服務提供者可能會在其 boot 方法中嘗試讀取快取值,我們將在 booting 回撥中註冊我們的自定義驅動。透過使用 booting 回撥,我們可以確保在呼叫應用程式服務提供者的 boot 方法之前、但在所有服務提供者的 register 方法被呼叫之後註冊自定義驅動。我們將把 booting 回撥註冊在應用程式 App\Providers\AppServiceProvider 類的 register 方法中。

1<?php
2 
3namespace App\Providers;
4 
5use App\Extensions\MongoStore;
6use Illuminate\Contracts\Foundation\Application;
7use Illuminate\Support\Facades\Cache;
8use Illuminate\Support\ServiceProvider;
9 
10class AppServiceProvider extends ServiceProvider
11{
12 /**
13 * Register any application services.
14 */
15 public function register(): void
16 {
17 $this->app->booting(function () {
18 Cache::extend('mongo', function (Application $app) {
19 return Cache::repository(new MongoStore);
20 });
21 });
22 }
23 
24 /**
25 * Bootstrap any application services.
26 */
27 public function boot(): void
28 {
29 // ...
30 }
31}

傳遞給 extend 方法的第一個引數是驅動程式的名稱。這將與您 config/cache.php 配置檔案中的 driver 選項相對應。第二個引數是一個閉包,它應該返回一個 Illuminate\Cache\Repository 例項。該閉包將接收一個 $app 例項,它是服務容器的一個例項。

擴充套件註冊後,將 CACHE_STORE 環境變數或您應用程式 config/cache.php 配置檔案中的 default 選項更新為您擴充套件的名稱。

活動

要在每次快取操作時執行程式碼,您可以監聽快取觸發的各種事件

事件名稱
Illuminate\Cache\Events\CacheFlushed
Illuminate\Cache\Events\CacheFlushing
Illuminate\Cache\Events\CacheFlushFailed
Illuminate\Cache\Events\CacheLocksFlushed
Illuminate\Cache\Events\CacheLocksFlushing
Illuminate\Cache\Events\CacheLocksFlushFailed
Illuminate\Cache\Events\CacheHit
Illuminate\Cache\Events\CacheMissed
Illuminate\Cache\Events\ForgettingKey
Illuminate\Cache\Events\KeyForgetFailed
Illuminate\Cache\Events\KeyForgotten
Illuminate\Cache\Events\KeyWriteFailed
Illuminate\Cache\Events\KeyWritten
Illuminate\Cache\Events\RetrievingKey
Illuminate\Cache\Events\RetrievingManyKeys
Illuminate\Cache\Events\WritingKey
Illuminate\Cache\Events\WritingManyKeys

為了提高效能,您可以透過將應用程式 config/cache.php 配置檔案中給定快取儲存的 events 配置選項設定為 false 來停用快取事件。

1'database' => [
2 'driver' => 'database',
3 // ...
4 'events' => false,
5],