跳到主要內容

快取

📝 此頁面為 Laravel 官方文檔的繁體中文翻譯。查看原始英文版本

快取

簡介

您的應用程式執行的一些資料檢索或處理任務可能是 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 命令來建立它:

php artisan make:cache-table

php artisan migrate

Memcached

使用 Memcached 驅動程式需要安裝 Memcached PECL 套件。您可以在 config/cache.php 配置檔案中列出所有 Memcached 伺服器。此檔案已經包含一個 memcached.servers 條目供您開始使用:

'memcached' => [
    // ...

    'servers' => [
        [
            'host' => env('MEMCACHED_HOST', '127.0.0.1'),
            'port' => env('MEMCACHED_PORT', 11211),
            'weight' => 100,
        ],
    ],
],

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

'memcached' => [
    // ...

    'servers' => [
        [
            'host' => '/var/run/memcached/memcached.sock',
            'port' => 0,
            'weight' => 100
        ],
    ],
],

Redis

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

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

儲存

storage 快取驅動程式允許您將快取值儲存在應用程式配置的任何文件系統磁碟上。當您想要使用現有磁碟(例如 S3 磁碟)作為鍵/值快取儲存時,這可能很有用:

'storage' => [
    'driver' => 'storage',
    'disk' => env('CACHE_STORAGE_DISK'),
    'path' => env('CACHE_STORAGE_PATH', 'framework/cache/data'),
],

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 通訊:

composer require aws/aws-sdk-php

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

'dynamodb' => [
    'driver' => 'dynamodb',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
    'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
    'endpoint' => env('DYNAMODB_ENDPOINT'),
],

MongoDB

如果您使用 MongoDB,官方 mongodb/laravel-mongodb 套件提供了一個 mongodb 快取驅動程式,可以使用 mongodb 資料庫連接進行配置。MongoDB 支援 TTL 索引,可用於自動清除過期的快取項目。

有關配置 MongoDB 的更多資訊,請參閱 MongoDB 快取和鎖文檔

快取用法

取得快取實例

要取得快取儲存實例,您可以使用 Cache 外觀,我們將在整個文檔中使用它。Cache 外觀提供了對 Laravel 快取合約底層實現的便利、簡潔的存取:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Cache;

class UserController extends Controller
{
    /**
     * 顯示應用程式所有使用者的列表。
     */
    public function index(): array
    {
        $value = Cache::get('key');

        return [
            // ...
        ];
    }
}

存取多個快取儲存

使用 Cache 外觀,您可以透過 store 方法存取各種快取儲存。傳遞給 store 方法的鍵應對應於 cache 配置檔案的 stores 配置陣列中列出的儲存之一:

$value = Cache::store('file')->get('foo');

Cache::store('redis')->put('bar', 'baz', 600); // 10 分鐘

從快取中檢索項目

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

$value = Cache::get('key');

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

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

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

判斷項目是否存在

has 方法可用於判斷項目是否存在於快取中。如果項目存在但其值為 null,此方法也將返回 false

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

遞增/遞减值

incrementdecrement 方法可用於調整快取中整數項目的值。這兩個方法都接受一個可選的第二個參數,表示要遞增或遞减項目值的金額:

// 如果值不存在則初始化...
Cache::add('key', 0, now()->plus(hours: 4));

// 遞增或遞减值...
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);

檢索並儲存

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

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

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

如果您需要知道該項目是從快取中檢索的還是透過執行給定閉包檢索的,可以使用 rememberWithWarmth 方法。此方法返回一個包含快取值和布林值的陣列,指示該項目是否為「熱」的,意味著它是從快取中檢索的,而不是從閉包中解析的:

[$value, $warm] = Cache::rememberWithWarmth('users', $seconds, function () {
    return DB::table('users')->get();
});

您可以使用 rememberForever 方法從快取中檢索項目,或者如果它不存在則永久存儲:

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

過期時重新驗證

使用 Cache::remember 方法時,如果快取值已過期,一些使用者可能會遇到回應時間緩慢的情況。對於某些類型的資料,允許提供部分過期的資料同時在後台重新計算快取值,可以防止一些使用者在計算快取值時遇到回應時間緩慢的情況。這通常被稱為「過期時重新驗證」模式,Cache::flexible 方法提供了此模式的實現。

flexible 方法接受一個陣列,指定快取值被視為「新鮮」的時間長度以及何時變為「過期」。陣列中的第一個值表示快取被視為新鮮的秒數,而第二個值定義在需要重新計算之前可以作為過期資料提供的時間長度。

如果在新鮮期內(在第一個值之前)發出請求,則立即返回快取而不重新計算。如果在過期期間(在兩個值之間)發出請求,則向使用者提供過期值,並註冊一個延遲函數,以便在將回應發送給使用者後重新整理快取值。如果在第二個值之後發出請求,則快取被視為已過期,值會立即重新計算,這可能導致使用者的回應時間較慢:

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

檢索並刪除

如果您需要從快取中檢索項目然後刪除該項目,可以使用 pull 方法。像 get 方法一樣,如果項目不存在於快取中,將返回 null

$value = Cache::pull('key');

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

在快取中儲存項目

您可以使用 Cache 外觀上的 put 方法將項目存儲在快取中:

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

如果未將儲存時間傳遞給 put 方法,則項目將被無限期存儲:

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

與其將秒數作為整數傳遞,您還可以傳遞一個 DateTime 實例,表示快取項目的期望過期時間:

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

不存在時存儲

add 方法只會在項目不存在於快取儲存中時將其添加到快取。如果項目實際上被添加到快取,該方法將返回 true。否則,該方法將返回 falseadd 方法是一個原子操作:

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

延長項目生命週期

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

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

您可以提供 DateTimeInterfaceDateIntervalCarbon 實例來指定確切的過期時間:

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

永久存儲項目

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

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

[!NOTE] 如果您正在使用 Memcached 驅動程式,當快取達到其大小限制時,「永久」存儲的項目可能會被移除。

從快取中移除項目

您可以使用 forget 方法從快取中移除項目:

Cache::forget('key');

您還可以透過提供零或負數的過期秒數來移除項目:

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

Cache::put('key', 'value', -5);

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

Cache::flush();

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

Cache::flushLocks();

[!WARNING] 刷新快取不會尊重您配置的快取「前綴」,並且會移除快取中的所有條目。清除其他應用程式共享的快取時,請仔細考慮這一點。

快取記憶化

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

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

use Illuminate\Support\Facades\Cache;

$value = Cache::memo()->get('key');

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

// 使用預設快取儲存...
$value = Cache::memo()->get('key');

// 使用 Redis 快取儲存...
$value = Cache::memo('redis')->get('key');

給定金鑰的第一次 get 呼叫從您的快取儲存中檢索值,但同一請求或作業中的後續呼叫將從記憶體中檢索值:

// 命中快取...
$value = Cache::memo()->get('key');

// 不命中快取,返回記憶化值...
$value = Cache::memo()->get('key');

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

Cache::memo()->put('name', 'Taylor'); // 寫入底層快取...
Cache::memo()->get('name');           // 命中底層快取...
Cache::memo()->get('name');           // 記憶化,不命中快取...

Cache::memo()->put('name', 'Tim');    // 忘記記憶化值,寫入新值...
Cache::memo()->get('name');           // 再次命中底層快取...

快取輔助函數

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

$value = cache('key');

如果您向函數提供鍵/值對陣列和過期時間,它將在指定的時間內將值存儲在快取中:

cache(['key' => 'value'], $seconds);

cache(['key' => 'value'], now()->plus(minutes: 10));

當不帶任何參數呼叫 cache 函數時,它返回 Illuminate\Contracts\Cache\Factory 實現的實例,允許您呼叫其他快取方法:

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

[!NOTE] 測試對全域 cache 函數的呼叫時,您可以使用 Cache::shouldReceive 方法,就像您正在測試外觀一樣。

快取標籤

[!WARNING] 使用 filedynamodbdatabasestorage 快取驅動程式時不支援快取標籤。

儲存標記的快取項目

快取標籤允許您標記快取中的相關項目,然後刷新所有已分配給定標籤的快取值。您可以透過傳遞標籤名稱的有序陣列來存取標記的快取。例如,讓我們存取一個標記的快取並將值 put 到快取中:

use Illuminate\Support\Facades\Cache;

Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);

存取標記的快取項目

透過標籤儲存的項目無法在不提供用於儲存值的標籤的情況下存取。要檢索標記的快取項目,請將相同的標籤有序列表傳遞給 tags 方法,然後使用您希望檢索的鍵呼叫 get 方法:

$john = Cache::tags(['people', 'artists'])->get('John');

$anne = Cache::tags(['people', 'authors'])->get('Anne');

移除標記的快取項目

您可以刷新所有分配給標籤或標籤列表的項目。例如,以下代碼將移除所有標記為 peopleauthors 或兩者的快取。因此,AnneJohn 都將從快取中移除:

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

相比之下,下面的代碼將只移除標記為 authors 的快取值,因此 Anne 將被移除,但 John 不會:

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

原子鎖

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

管理鎖

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

use Illuminate\Support\Facades\Cache;

$lock = Cache::lock('foo', 10);

if ($lock->get()) {
    // 鎖已獲取 10 秒...

    $lock->release();
}

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

Cache::lock('foo', 10)->get(function () {
    // 鎖已獲取 10 秒並自動釋放...
});

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

use Illuminate\Contracts\Cache\LockTimeoutException;

$lock = Cache::lock('foo', 10);

try {
    $lock->block(5);

    // 等待最多 5 秒後獲取鎖...
} catch (LockTimeoutException $e) {
    // 無法獲取鎖...
} finally {
    $lock->release();
}

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

Cache::lock('foo', 10)->block(5, function () {
    // 等待最多 5 秒後獲取鎖 10 秒...
});

跨程序管理鎖

有時,您可能希望在一個程序中獲取鎖,並在另一個程序中釋放它。例如,您可能在 Web 請求期間獲取一個鎖,並希望在該請求觸發的佇列作業結束時釋放該鎖。在這種情況下,您應該將鎖的範圍「所有者令牌」傳遞給佇列作業,以便作業可以使用給定的令牌重新實例化該鎖。

在下面的範例中,如果成功獲取鎖,我們將派發一個佇列作業。此外,我們將透過鎖的 owner 方法將鎖的所有者令牌傳遞給佇列作業:

$podcast = Podcast::find($id);

$lock = Cache::lock('processing', 120);

if ($lock->get()) {
    ProcessPodcast::dispatch($podcast, $lock->owner());
}

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

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

如果您希望在不尊重其當前所有者的情況下釋放鎖,可以使用 forceRelease 方法:

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

刷新鎖

如果您需要延長您當前擁有的鎖的過期時間,可以使用 refresh 方法。如果未提供秒數,則使用鎖的原始持續時間。對於長時間運行的操作很有用,在這些操作中您更喜歡獲取一個短鎖並定期延長它,而不是獲取一個具有非常長過期時間的鎖:

$lock = Cache::lock('generate-reports', 60);

if ($lock->get()) {
    foreach ($reports as $report) {
        $report->generate();

        // 將鎖延長另外 60 秒...
        $lock->refresh();
    }

    $lock->release();
}

並發限制

Laravel 的原子鎖功能還提供了幾種限制閉包並發執行的方法。當您想要只允許基礎設施中有一個運行實例時,使用 withoutOverlapping

Cache::withoutOverlapping('foo', function () {
    // 等待最多 10 秒後獲取鎖...
});

預設情況下,鎖會一直持有直到閉包執行完成,並且該方法最多等待 10 秒來獲取鎖。您可以使用額外的參數來自訂這些值:

Cache::withoutOverlapping('foo', function () {
    // 等待最多 5 秒後獲取鎖 120 秒...
}, lockFor: 120, waitFor: 5);

如果在指定的等待時間內無法獲取鎖,將拋出 Illuminate\Contracts\Cache\LockTimeoutException

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

Cache::funnel('foo')
    ->limit(3)
    ->releaseAfter(60)
    ->block(10)
    ->then(function () {
        // 並發鎖已獲取...
    }, function () {
        // 無法獲取並發鎖...
    });

funnel 鍵標識正在被限制的資源。limit 方法定義最大並發執行數。releaseAfter 方法設定一個安全逾時(秒),在該時間後自動釋放已獲取的插槽。block 方法設定等待可用插槽的秒數。

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

use Illuminate\Cache\Limiters\LimiterTimeoutException;

try {
    Cache::funnel('foo')
        ->limit(3)
        ->releaseAfter(60)
        ->block(10)
        ->then(function () {
            // 並發鎖已獲取...
        });
} catch (LimiterTimeoutException $e) {
    // 無法獲取並發鎖...
}

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

Cache::store('redis')->funnel('foo')
    ->limit(3)
    ->block(10)
    ->then(function () {
        // 使用 "redis" 儲存獲取並發鎖...
    });

[!NOTE] funnel 方法要求快取儲存實現 Illuminate\Contracts\Cache\LockProvider 介面。如果您嘗試在不支援鎖的快取儲存上使用 funnel,將拋出 BadMethodCallException

快取故障轉移

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

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

'failover' => [
    'driver' => 'failover',
    'stores' => [
        'database',
        'array',
    ],
],

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

CACHE_STORE=failover

當快取儲存操作失敗並啟用故障轉移時,Laravel 將派發 Illuminate\Cache\Events\CacheFailedOver 事件,允許您檢舉或記錄快取儲存已失敗。

添加自訂快取驅動程式

編寫驅動程式

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

<?php

namespace App\Extensions;

use Illuminate\Contracts\Cache\Store;

class MongoStore implements Store
{
    public function get($key) {}
    public function many(array $keys) {}
    public function put($key, $value, $seconds) {}
    public function putMany(array $values, $seconds) {}
    public function increment($key, $value = 1) {}
    public function decrement($key, $value = 1) {}
    public function forever($key, $value) {}
    public function forget($key) {}
    public function flush() {}
    public function getPrefix() {}
}

我們只需要使用 MongoDB 連接來實現這些方法。有關如何實現這些方法的範例,請查看 Laravel 框架原始碼中的 Illuminate\Cache\MemcachedStore。一旦我們的實現完成,我們可以透過呼叫 Cache 外觀的 extend 方法來完成自訂驅動程式的註冊:

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

[!NOTE] 如果您想知道將自訂快取驅動程式代碼放在哪裡,可以在 app 目錄中建立一個 Namespaces 命名空間。但是,請記住 Laravel 沒有嚴格的應用程式結構,您可以根據自己的偏好來組織應用程式。

註冊驅動程式

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

<?php

namespace App\Providers;

use App\Extensions\MongoStore;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 註冊任何應用程式服務。
     */
    public function register(): void
    {
        $this->app->booting(function () {
             Cache::extend('mongo', function (Application $app) {
                 return Cache::repository(new MongoStore);
             });
         });
    }

    /**
     * 啟動任何應用程式服務。
     */
    public function boot(): void
    {
        // ...
    }
}

傳遞給 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 來禁用快取事件:

'database' => [
    'driver' => 'database',
    // ...
    'events' => false,
],