système de mise en cache
Système de mise en cache
- Configuration
- Utilisation du cache
- Étiquette de cache
- Ajouter une personnalisation pilote de cache
- Événement
Configuration
Laravel fournit un API riche et unifiée pour divers caches backend et ses informations de configuration se trouve dans le fichier config/cache.php
. Dans ce fichier, vous pouvez spécifier le pilote de cache que l'application utilise par défaut. Laravel prend en charge les caches backend populaires tels que Memcachedconfig/cache.php
文件中。在该文件中你可以指定应用默认使用哪个缓存驱动。Laravel 支持当前流行的后端缓存,例如 Memcached 和 Redis 。
缓存配置文件还包含各种其他选项,这些选项都记录在文件中,因此请确保阅读这些选项。默认情况下,Laravel 配置为使用 file
et Redis
Base de données
Lorsque vous utilisez le pilote de cache database
, vous devez configurer une table pour stocker les données du cache. Voici un exemple de déclaration Schema
pour créer une structure de table de données de cache : database
缓存驱动时,你需要配置一个表来存放缓存数据。下面是构建缓存数据表结构的 Schema
声明示例:
Schema::create('cache', function ($table) { $table->string('key')->unique(); $table->text('value'); $table->integer('expiration'); });
{tip} 你也可以使用 Artisan 命令
php artisan cache:table
来生成合适的迁移。
Memcached
使用 Memcached 驱动需要安装 Memcached PECL 扩展包 。你可以把所有的 Memcached 服务器都列在 config/cache.php
配置文件中:
'memcached' => [ [ 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100 ], ],
你可以将 host
选项设置为 UNIX socket 路径。如果你这样配置了, port
选项应该设置为 0
:
'memcached' => [ [ 'host' => '/var/run/memcached/memcached.sock', 'port' => 0, 'weight' => 100 ], ],
Redis
在使用 Laravel 的 Redis 缓存之前,你需要通过 Composer 安装 predis/predis
扩展包 (~1.0) 或者使用 PECL 安装 PhpRedis PHP 扩展。
如需了解更多关于 Redis 的配置,请参考 Laravel Redis 文档。
缓存的使用
获取缓存实例
IlluminateContractsCacheFactory
和 IlluminateContractsCacheRepository
契约 提供了 Laravel 缓存服务的访问机制。 Factory
契约为你的应用程序定义了访问所有缓存驱动的机制。 Repository
契约通常是由你的 cache
配置文件指定的默认缓存驱动实现的。
不过,你也可以使用 Cache
Facade,我们将在后续的文档中介绍。 Cache
Facade 为 Laravel 缓存契约底层的实现提供了方便又简洁的方法:
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Cache; class UserController extends Controller{ /** * 展示应用的所有用户列表。 * * @return Response */ public function index() { $value = Cache::get('key'); // } }
访问多个缓存存储
使用 Cache
Facade,你可以通过 store
方法来访问各种缓存存储。传入 store
方法的键应该对应 cache
配置信息文件中的 stores
$value = Cache::store('file')->get('foo'); Cache::store('redis')->put('bar', 'baz', 600); // 10 分钟
{tip} Vous pouvez également utiliser la commande Artisan php artisan cache:table code> pour générer la migration appropriée.
config/cache.php
: 🎜$value = Cache::get('key'); $value = Cache::get('key', 'default');🎜 Vous pouvez définir l'option
host
sur le chemin du socket UNIX. Si vous le configurez de cette façon, l'option port
doit être définie sur 0
: 🎜$value = Cache::get('key', function () { return DB::table(...)->get(); });
predis/predis
(~1.0) via Composer ou utiliser PECL pour installer l'extension PHP PhpRedis. 🎜🎜Pour en savoir plus sur la configuration de Redis, veuillez vous référer à la documentation de Laravel Redis. 🎜🎜🎜🎜Utilisation du cache
🎜🎜🎜Obtenir une instance de cache
🎜IlluminateContractsCacheFactory
et IlluminateContractsCacheRepository
Le contrat fournit le mécanisme d'accès au service de cache de Laravel. Le contrat Factory
définit le mécanisme permettant à votre application d'accéder à tous les pilotes de cache. Le contrat Repository
est généralement implémenté par le pilote de cache par défaut spécifié dans votre fichier de configuration cache
. 🎜🎜Cependant, vous pouvez également utiliser la façade Cache
, que nous présenterons dans les documents ultérieurs. Cache
Facade fournit une méthode pratique et concise pour l'implémentation sous-jacente du contrat de cache Laravel : 🎜if (Cache::has('key')) { // }
Cache
, vous pouvez accéder à différents magasins de cache via la méthode store
. La clé passée dans la méthode store
doit correspondre à l'un des magasins répertoriés dans le tableau de configuration stores
dans le fichier d'informations de configuration cache
: 🎜Cache::increment('key'); Cache::increment('key', $amount); Cache::decrement('key'); Cache::decrement('key', $amount);🎜🎜 🎜🎜🎜🎜
Obtenir des données du cache
Cache
La méthode get
de Facade est la méthode utilisée pour obtenir des données du cache. Si les données n'existent pas dans le cache, la méthode retournera null
. Comme vous pouvez l'imaginer, vous pouvez également passer un deuxième paramètre à la méthode get
, qui spécifie la valeur par défaut que vous souhaitez renvoyer si les données recherchées n'existent pas : Cache
Facade 的 get
方法是用来从缓存中获取数据的方法。如果该数据在缓存中不存在,那么该方法将返回 null
。正如你想的那样,你也可以向 get
方法传递第二个参数,用来指定如果查找的数据不存在时你希望返回的默认值:
$value = Cache::remember('users', $seconds, function () { return DB::table('users')->get(); });
你甚至可以传递 Closure
作为默认值。如果指定的数据在缓存中不存在,将返回 Closure
的结果。传递闭包的方法允许你从数据库或其他外部服务中获取默认值:
$value = Cache::rememberForever('users', function () { return DB::table('users')->get(); });
检查缓存项是否存在
has
方法可以用于判断缓存项是否存在。如果为 null
或 false
则该方法将会返回 false
:
$value = Cache::pull('key');
递增与递减值
increment
和 decrement
方法可以用来调整缓存中整数项的值。这两个方法都可以传入第二个可选参数,这个参数用来指明要递增或递减的数量:
Cache::put('key', 'value', $seconds);
获取和存储
有时你可能想从缓存中获取一个数据,而当请求的缓存项不存在时,程序能为你存储一个默认值。例如,你可能想从缓存中获取所有用户,当缓存中不存在这些用户时,程序将从数据库将这些用户取出并放入缓存。你可以使用 Cache::remember
方法来实现:
Cache::put('key', 'value');
如果缓存中不存在你想要的数据时,则传递给 remember
方法的 闭包
将被执行,然后将其结果返回并放置到缓存中。
你可以使用 rememberForever
方法从缓存中获取数据或者永久存储它:
Cache::put('key', 'value', now()->addMinutes(10));
获取和删除
如果你需要从缓存中获取到数据之后再删除它,你可以使用 pull
方法。和 get
方法一样,如果缓存不存在,则返回 null
:
Cache::add('key', 'value', $seconds);
在缓存中存储数据
你可以使用 Cache
Facade 的 put
方法将数据存储到缓存中:
Cache::forever('key', 'value');
如果缓存的过期时间没有传递给 put
方法, 则缓存将永久有效:
Cache::forget('key');
除了以整数形式传递过期时间的秒数,你还可以传递一个 DateTime
实例来表示该数据的过期时间:
Cache::put('key', 'value', 0); Cache::put('key', 'value', -5);
只存储没有的数据
add
方法将只存储缓存中不存在的数据。如果存储成功,将返回 true
,否则返回 false
Cache::flush();Vous pouvez même passer < code>Fermeture comme valeur par défaut. Si les données spécifiées n'existent pas dans le cache, le résultat de
Closure
sera renvoyé. Passer une méthode de fermeture vous permet d'obtenir la valeur par défaut d'une base de données ou d'un autre service externe : use Illuminate\Support\Facades\Cache; $lock = Cache::lock('foo', 10); if ($lock->get()) { //获取锁定10秒... $lock->release(); }
Vérifier si l'élément mis en cache existe
🎜 < La méthode code>has peut être utilisée pour déterminer si l'élément de cache existe. S'il estnull
ou false
, cette méthode retournera false
: 🎜Cache::lock('foo')->get(function () { // 获取无限期锁并自动释放... });
Incrémenter et décrémenter les valeurs
🎜Les méthodesincrement
et decrement
peuvent être utilisées pour ajuster la valeur des éléments entiers dans le cache. Les deux méthodes peuvent transmettre un deuxième paramètre facultatif, qui est utilisé pour spécifier le montant à incrémenter ou décrémenter : 🎜use Illuminate\Contracts\Cache\LockTimeoutException; $lock = Cache::lock('foo', 10);try { $lock->block(5); // 等待最多5秒后获取的锁... } catch (LockTimeoutException $e) { // 无法获取锁... } finally { optional($lock)->release(); } Cache::lock('foo', 10)->block(5, function () { // 等待最多5秒后获取的锁... });
Obtenir la somme de stockage h4>🎜Parfois, vous souhaiterez peut-être obtenir des données du cache, et lorsque l'élément de cache demandé n'existe pas, le programme peut stocker une valeur par défaut pour vous. Par exemple, vous souhaiterez peut-être extraire tous les utilisateurs du cache. Lorsque ces utilisateurs n'existent pas dans le cache, le programme les récupérera dans la base de données et les placera dans le cache. Vous pouvez utiliser la méthode Cache::remember
pour y parvenir : 🎜// 控制器里面...
$podcast = Podcast::find($id);
if ($lock = Cache::lock('foo', 120)->get()) {
ProcessPodcast::dispatch($podcast, $lock->owner());
}
// ProcessPodcast Job 里面...
Cache::restoreLock('foo', $this->owner)->release();
🎜Si la donnée souhaitée n'existe pas dans le cache, passez-la à la fermeture du remember< Méthode /code> Le package
sera exécuté et ses résultats seront renvoyés et placés dans le cache. 🎜🎜Vous pouvez utiliser la méthode rememberForever
pour récupérer les données du cache ou les stocker de manière permanente : 🎜Cache::lock('foo')->forceRelease();
🎜Get et delete h4>🎜Si vous avez besoin d'extraire des données du cache puis de les supprimer, vous pouvez utiliser la méthode pull
. Comme la méthode get
, si le cache n'existe pas, null
est renvoyé : 🎜$value = cache('key');
🎜< /a >🎜🎜🎜Stocker les données dans le cache🎜🎜Vous pouvez utiliser la méthode put
du Cache
Façade pour mettre le data Store dans le cache : 🎜cache(['key' => 'value'], $seconds);
cache(['key' => 'value'], now()->addMinutes(10));
🎜 Si le délai d'expiration mis en cache n'est pas transmis à la méthode put
, le cache sera valide pour toujours : 🎜cache()->remember('users', $seconds, function () {
return DB::table('users')->get();
});
🎜En plus de passer l'expiration time en secondes sous forme d'entier, vous pouvez également passer une instance DateTime
pour représenter l'heure d'expiration des données : 🎜Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);
🎜Stocker uniquement les données qui n'existent pas
🎜< La méthode code>add stockera uniquement les données qui n'existent pas dans le cache. Si le stockage réussit, true
sera renvoyé, sinon false
sera renvoyé : 🎜$john = Cache::tags(['people', 'artists'])->get('John');
$anne = Cache::tags(['people', 'authors'])->get('Anne');
🎜🎜La méthode Stockage permanent des données
forever
peut être utilisée pour stocker de manière persistante des données dans le cache. Parce que ces données n'expireront pas, elles doivent être supprimées manuellement du cache via la méthode forget
: forever
方法可用于持久化将数据存储到缓存中。因为这些数据不会过期,所以必须通过 forget
方法从缓存中手动删除它们:
Cache::tags(['people', 'authors'])->flush();
{tip} 如果你使用 Memcached 驱动,当缓存数据达到存储上限时,「永久存储」 的数据可能会被删除。
删除缓存中的数据
你可以使用 forget
方法从缓存中删除这些数据:
Cache::tags('authors')->flush();
你也可以通过提供零或者负的 TTL 值删除这些数据:
<?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() {}
}
你可以使用 flush
方法清空所有的缓存:
Cache::extend('mongo', function ($app) {
return Cache::repository(new MongoStore);
});
{note} 清空缓存的方法并不会考虑缓存前缀,会将缓存中的所有内容删除。因此在清除与其它应用程序共享的缓存时,请慎重考虑。
原子锁
{note} 要使用该特性,你的应用必须使用 memcached
, dynamodb
或 redis
缓存驱动作为你应用的默认缓存驱动。此外,所有服务器必须与同一中央缓存服务器进行通信。
原子锁允许对分布式锁进行操作而不必担心竞争条件。例如, Laravel Forge 使用原子锁来确保在一台服务器上每次只有一个远程任务在执行。你可以使用 Cache::lock
方法来创建和管理锁:
<?php
namespace App\Providers;use App\Extensions\MongoStore;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\ServiceProvider;
class CacheServiceProvider extends ServiceProvider{
/**
* 执行服务的注册后引导。
*
* @return void
*/
public function boot()
{
Cache::extend('mongo', function ($app) {
return Cache::repository(new MongoStore);
});
}
/**
* 在容器中注册绑定。
*
* @return void
*/
public function register()
{
//
}
}
get
方法也可以接收一个闭包。在闭包执行之后,Laravel 将会自动释放锁:
/**
* 应用的事件监听器映射
*
* @var array
*/
protected $listen = [
'Illuminate\Cache\Events\CacheHit' => [
'App\Listeners\LogCacheHit',
],
'Illuminate\Cache\Events\CacheMissed' => [
'App\Listeners\LogCacheMissed',
],
'Illuminate\Cache\Events\KeyForgotten' => [
'App\Listeners\LogKeyForgotten',
],
'Illuminate\Cache\Events\KeyWritten' => [
'App\Listeners\LogKeyWritten',
],
];
如果你在请求时锁无法使用,你可以控制 Laravel 等待指定的秒数。如果在指定的时间限制内无法获取锁,则会抛出 IlluminateContractsCacheLockTimeoutException
:
rrreee管理跨进程的锁
有时,你希望在一个进程中获取锁并在另外一个进程中释放它。例如,你可以在 Web 请求期间获取锁,并希望在该请求触发的队列作业结束时释放锁。在这种情况下,你应该将锁的作用域「owner token」传递给队列作业,以便作业可以使用给定的 token 重新实例化锁:
rrreee如果你想在不尊重当前锁的所有者的情况下释放锁,你可以使用 forceRelease
rrreee
{tip} Si vous utilisez le pilote Memcached, lorsque les données mises en cache atteignent le stockage limite, " Les données stockées de manière permanente peuvent être supprimées.
Supprimer des données du cache h3>
Vous pouvez supprimer ces données du cache en utilisant la méthode forget
: 🎜rrreee🎜Vous pouvez également supprimer ces données en fournissant une valeur TTL nulle ou négative : 🎜rrreee🎜Vous pouvez utiliser flush
Méthode pour vider tous les caches : 🎜rrreee🎜{note} La méthode de vider le cache ne prend pas en compte le préfixe du cache et supprimera tout le contenu du cache. Veuillez donc réfléchir attentivement lorsque vous videz le cache partagé avec d'autres applications. 🎜
🎜🎜🎜🎜Serrures atomiques
🎜{note} Pour utiliser cette fonctionnalité, votre application doit utiliser le pilote de cache memcached
, dynamodb
ou redis
comme pilote de cache par défaut de votre application. De plus, tous les serveurs doivent communiquer avec le même serveur de cache central. 🎜
🎜Les verrous atomiques permettent d'effectuer des opérations sur des verrous distribués sans se soucier des conditions de concurrence. Par exemple, Laravel Forge🎜 utilise des verrous atomiques pour garantir qu'une seule tâche distante est exécutée sur un serveur à la fois. Vous pouvez utiliser la méthode Cache::lock
pour créer et gérer des verrous : 🎜rrreee🎜 La méthode get
peut également recevoir une fermeture. Une fois la fermeture exécutée, Laravel libérera automatiquement le verrou : 🎜rrreee🎜 Si le verrou n'est pas disponible au moment de votre demande, vous pouvez contrôler Laravel pour qu'il attende un nombre de secondes spécifié. Si le verrou ne peut pas être acquis dans le délai spécifié, IlluminateContractsCacheLockTimeoutException
sera levée : 🎜rrreee🎜🎜Gérer les verrous inter-processus🎜🎜 Parfois, vous souhaitez acquérir un verrou dans un processus et le libérer dans un autre processus. Par exemple, vous pouvez acquérir un verrou lors d'une requête Web et vouloir le libérer à la fin de la tâche en file d'attente déclenchée par cette requête. Dans ce cas, vous devez transmettre le "jeton de propriétaire" de la portée du verrou au travail en file d'attente afin que le travail puisse ré-instancier le verrou avec le jeton donné : 🎜rrreee🎜 Si vous souhaitez faire cela sans respecter le propriétaire actuel du verrou, libérer le verrou, vous pouvez utiliser la méthode forceRelease
: 🎜rrreee🎜🎜🎜🎜🎜🎜Fonction d'assistance de cache
En plus d'utiliser le contrat Cache
Façade ou Cache, vous pouvez également utiliser la fonction d'assistance globale cache
pour obtenir et enregistrer les données du cache. Lorsque la fonction cache
n'accepte qu'un paramètre chaîne, elle renverra la valeur correspondant à la clé donnée : Cache
Facade 或 Cache 契约 外,你还可以使用全局辅助函数 cache
来获取和保存缓存数据。当 cache
函数只接收一个字符串参数的时候,它将会返回给定键对应的值:
rrreee如果你向函数提供了一组键值对和过期时间,它将会在指定时间内缓存数据:
rrreee当 cache
函数在没有任何参数的情况下被调用时,它返回一个 IlluminateContractsCacheFactory
实现的实例,允许你调用其它缓存方法:
rrreee{tip} 如果在测试中使用全局辅助函数 cache
,你可以使用 Cache::shouldReceive
方法就像 测试 Facade。
缓存标记
{note} 缓存标记不支持使用 file
和 database
缓存驱动。此外,当使用多个缓存标记的缓存设置为「永久」时,类似 memcached
的缓存驱动性能最佳,它会自动清除旧的记录。
写入被标记的缓存数据
缓存标记允许你给缓存相关进行标记,以便后续清除这些缓存值。你可以通过传入标记名称的有序数组来访问标记的缓存。例如,我们可以使用标记的同时使用 put
方法设置缓存。
rrreee访问被标记的缓存数据
若要获取一个被标记的缓存数据,请将相同的有序标记数组传递给 tags
方法,然后调用 get
方法来获取你要检索的键:
rrreee移除被标记的缓存数据
你可以清空有单个标记或是一组标记的所有缓存数据。例如,下面的语句会被标记为 people
,authors
或两者都有的缓存。所以,Anne
和 John
都会从缓存中被删除:
rrreee相反,下面的语句只会删除被标记 authors
的缓存,所以 Anne
会被删除,但 John
rrreee
Si vous fournissez à la fonction un ensemble de paires clé-valeur et un délai d'expiration, elle will Mettra en cache les données pendant une durée spécifiée : {tip} Si vous utilisez la fonction d'assistance globale cache
dans vos tests, vous pouvez utiliser la méthode Cache::shouldReceive
tout comme la méthode tester Façade. {note} L'utilisation des balises de cache n'est pas pris en charge par les pilotes de cache file
et database
. De plus, un pilote de cache tel que memcached
fonctionne mieux lorsque le cache utilisant plusieurs balises de cache est défini sur « persistant », ce qui efface automatiquement les anciens enregistrements. 🎜🎜🎜🎜Écrire des données de cache balisées🎜🎜Cache tag Vous permet de marquez les valeurs mises en cache afin qu'elles puissent être effacées ultérieurement. Vous pouvez accéder au cache des balises en transmettant un tableau ordonné de noms de balises. Par exemple, nous pouvons définir le cache en utilisant la méthode put
avec la balise. 🎜rrreee🎜🎜🎜🎜🎜Accéder aux données du cache balisées🎜🎜Pour obtenir un cache balisé Pour mettre en cache les données , transmettez le même tableau ordonné de balises à la méthode tags
, puis appelez la méthode get
pour obtenir la clé que vous souhaitez récupérer : 🎜rrreee🎜🎜🎜🎜🎜Suppression des données de cache balisées🎜🎜Vous pouvez effacer une seule balise ou un groupe de balises Toutes les données mises en cache. Par exemple, l'instruction suivante serait mise en cache sous les noms people
, authors
ou les deux. Par conséquent, Anne
et John
seront supprimés du cache : 🎜rrreee🎜En revanche, l'instruction suivante supprimera uniquement le cache marqué auteurs
, Donc Anne
sera supprimé, mais John
ne le sera pas : 🎜rrreee🎜🎜🎜🎜🎜🎜🎜Ajouter un pilote de cache personnalisé🎜🎜🎜🎜🎜🎜🎜Écriture du pilote
Pour créer un pilote de cache personnalisé, vous devez d'abord implémenter le contrat IlluminateContractsCacheStore
. Par conséquent, l'implémentation du cache de MongoDB ressemblera à ceci : IlluminateContractsCacheStore
契约。因此, MongoDB 的缓存实现看起来会像这样:
rrreee我们只需要 MongoDB 的连接来实现这些方法。关于如何实现这些方法的实例,可以参阅框架源代码中的 IlluminateCacheMemcachedStore
。一旦完成契约额实现后,就可以像下面这样完成自定义驱动的注册了。
rrreee{tip} 如果你不知道将缓存驱动代码放在哪,你可以在 app
目录下创建一个 Extensions
命名空间。然而,Laravel 并没有硬性规定应用程序的结构,你可以根据自己的喜好自由组织你的应用程序。
注册驱动
要使用 Laravel 来注册自定义缓存驱动,就要在 Cache
Facade 上使用 extend
方法。 对 Cache::extend
的调用可以在新的 Laravel 应用程序中自带的 AppProvidersAppServiceProvider
的 boot
方法中完成,或者你也可以创建自己的服务提供者来存放扩展,只是不要忘记在 config/app.php
的 provider 数组中注册服务提供者:
rrreee传递给 extend
方法的第一个参数是驱动程序的名称。这将与 config/cache.php
配置文件的 driver
选项相对应。第二个参数是一个应该返回 IlluminateCacheRepository
实例的闭包。该闭包将传递一个 服务容器 的 $app
实例。
一旦你的扩展程序注册后,需要将 config/cache.php
配置文件中的 driver
选项更新为你的扩展名称。
事件
要在每次缓存操作时执行代码,你可以监听缓存触发的 事件 。通常,你应该将这些事件监听器放在 EventServiceProvider
rrreee
Nous n'avons besoin que de la connexion MongoDB pour implémenter ces méthodes. Pour des exemples d'implémentation de ces méthodes, consultez IlluminateCacheMemcachedStore
dans le code source du framework. Une fois le contrat complété, vous pouvez finaliser l'enregistrement du chauffeur personnalisé comme suit. 🎜🎜🎜Enregistrement du pilote🎜🎜Pour utiliser Laravel pour enregistrer un cache personnalisé driver , vous devez utiliser la méthode extend
sur la façade Cache
. L'appel à Cache::extend
peut être effectué dans la méthode boot
du AppProvidersAppServiceProvider
fourni avec la nouvelle application Laravel, ou vous pouvez créer votre propre fournisseur de services pour stocker les extensions, n'oubliez pas d'enregistrer le fournisseur de services dans le tableau des fournisseurs de config/app.php
: 🎜rrreee🎜 passé au extend
méthode Le premier paramètre est le nom du pilote. Cela correspondra à l'option driver
du fichier de configuration config/cache.php
. Le deuxième paramètre est une fermeture qui doit renvoyer une instance de IlluminateCacheRepository
. La fermeture recevra une instance $app
du conteneur de service. 🎜🎜Une fois votre extension enregistrée, vous devez mettre à jour l'option driver
dans le fichier de configuration config/cache.php
avec le nom de votre extension. 🎜🎜🎜🎜🎜Événements
🎜Pour exécuter du code à chaque opération de cache, vous pouvez écouter le déclenchement du cache événements. En règle générale, vous devez placer ces écouteurs d'événements dans EventServiceProvider
: 🎜rrreee🎜Cet article est apparu pour la première fois sur le site Web 🎜LearnKu.com🎜. 🎜🎜
remember< Méthode /code> Le package
sera exécuté et ses résultats seront renvoyés et placés dans le cache. 🎜🎜Vous pouvez utiliser la méthode rememberForever
pour récupérer les données du cache ou les stocker de manière permanente : 🎜Cache::lock('foo')->forceRelease();
Get et delete h4>🎜Si vous avez besoin d'extraire des données du cache puis de les supprimer, vous pouvez utiliser la méthode pull
. Comme la méthode get
, si le cache n'existe pas, null
est renvoyé : 🎜$value = cache('key');
🎜< /a >🎜🎜🎜Stocker les données dans le cache🎜🎜Vous pouvez utiliser la méthode put
du Cache
Façade pour mettre le data Store dans le cache : 🎜cache(['key' => 'value'], $seconds);
cache(['key' => 'value'], now()->addMinutes(10));
🎜 Si le délai d'expiration mis en cache n'est pas transmis à la méthode put
, le cache sera valide pour toujours : 🎜cache()->remember('users', $seconds, function () {
return DB::table('users')->get();
});
🎜En plus de passer l'expiration time en secondes sous forme d'entier, vous pouvez également passer une instance DateTime
pour représenter l'heure d'expiration des données : 🎜Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);
🎜Stocker uniquement les données qui n'existent pas
🎜< La méthode code>add stockera uniquement les données qui n'existent pas dans le cache. Si le stockage réussit, true
sera renvoyé, sinon false
sera renvoyé : 🎜$john = Cache::tags(['people', 'artists'])->get('John');
$anne = Cache::tags(['people', 'authors'])->get('Anne');
🎜🎜La méthode Stockage permanent des données
forever
peut être utilisée pour stocker de manière persistante des données dans le cache. Parce que ces données n'expireront pas, elles doivent être supprimées manuellement du cache via la méthode forget
: forever
方法可用于持久化将数据存储到缓存中。因为这些数据不会过期,所以必须通过 forget
方法从缓存中手动删除它们:
Cache::tags(['people', 'authors'])->flush();
{tip} 如果你使用 Memcached 驱动,当缓存数据达到存储上限时,「永久存储」 的数据可能会被删除。
删除缓存中的数据
你可以使用 forget
方法从缓存中删除这些数据:
Cache::tags('authors')->flush();
你也可以通过提供零或者负的 TTL 值删除这些数据:
<?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() {}
}
你可以使用 flush
方法清空所有的缓存:
Cache::extend('mongo', function ($app) {
return Cache::repository(new MongoStore);
});
{note} 清空缓存的方法并不会考虑缓存前缀,会将缓存中的所有内容删除。因此在清除与其它应用程序共享的缓存时,请慎重考虑。
原子锁
{note} 要使用该特性,你的应用必须使用 memcached
, dynamodb
或 redis
缓存驱动作为你应用的默认缓存驱动。此外,所有服务器必须与同一中央缓存服务器进行通信。
原子锁允许对分布式锁进行操作而不必担心竞争条件。例如, Laravel Forge 使用原子锁来确保在一台服务器上每次只有一个远程任务在执行。你可以使用 Cache::lock
方法来创建和管理锁:
<?php
namespace App\Providers;use App\Extensions\MongoStore;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\ServiceProvider;
class CacheServiceProvider extends ServiceProvider{
/**
* 执行服务的注册后引导。
*
* @return void
*/
public function boot()
{
Cache::extend('mongo', function ($app) {
return Cache::repository(new MongoStore);
});
}
/**
* 在容器中注册绑定。
*
* @return void
*/
public function register()
{
//
}
}
get
方法也可以接收一个闭包。在闭包执行之后,Laravel 将会自动释放锁:
/**
* 应用的事件监听器映射
*
* @var array
*/
protected $listen = [
'Illuminate\Cache\Events\CacheHit' => [
'App\Listeners\LogCacheHit',
],
'Illuminate\Cache\Events\CacheMissed' => [
'App\Listeners\LogCacheMissed',
],
'Illuminate\Cache\Events\KeyForgotten' => [
'App\Listeners\LogKeyForgotten',
],
'Illuminate\Cache\Events\KeyWritten' => [
'App\Listeners\LogKeyWritten',
],
];
如果你在请求时锁无法使用,你可以控制 Laravel 等待指定的秒数。如果在指定的时间限制内无法获取锁,则会抛出 IlluminateContractsCacheLockTimeoutException
:
rrreee管理跨进程的锁
有时,你希望在一个进程中获取锁并在另外一个进程中释放它。例如,你可以在 Web 请求期间获取锁,并希望在该请求触发的队列作业结束时释放锁。在这种情况下,你应该将锁的作用域「owner token」传递给队列作业,以便作业可以使用给定的 token 重新实例化锁:
rrreee如果你想在不尊重当前锁的所有者的情况下释放锁,你可以使用 forceRelease
rrreee
{tip} Si vous utilisez le pilote Memcached, lorsque les données mises en cache atteignent le stockage limite, " Les données stockées de manière permanente peuvent être supprimées.
Supprimer des données du cache h3>
Vous pouvez supprimer ces données du cache en utilisant la méthode forget
: 🎜rrreee🎜Vous pouvez également supprimer ces données en fournissant une valeur TTL nulle ou négative : 🎜rrreee🎜Vous pouvez utiliser flush
Méthode pour vider tous les caches : 🎜rrreee🎜{note} La méthode de vider le cache ne prend pas en compte le préfixe du cache et supprimera tout le contenu du cache. Veuillez donc réfléchir attentivement lorsque vous videz le cache partagé avec d'autres applications. 🎜
🎜🎜🎜🎜Serrures atomiques
🎜{note} Pour utiliser cette fonctionnalité, votre application doit utiliser le pilote de cache memcached
, dynamodb
ou redis
comme pilote de cache par défaut de votre application. De plus, tous les serveurs doivent communiquer avec le même serveur de cache central. 🎜
🎜Les verrous atomiques permettent d'effectuer des opérations sur des verrous distribués sans se soucier des conditions de concurrence. Par exemple, Laravel Forge🎜 utilise des verrous atomiques pour garantir qu'une seule tâche distante est exécutée sur un serveur à la fois. Vous pouvez utiliser la méthode Cache::lock
pour créer et gérer des verrous : 🎜rrreee🎜 La méthode get
peut également recevoir une fermeture. Une fois la fermeture exécutée, Laravel libérera automatiquement le verrou : 🎜rrreee🎜 Si le verrou n'est pas disponible au moment de votre demande, vous pouvez contrôler Laravel pour qu'il attende un nombre de secondes spécifié. Si le verrou ne peut pas être acquis dans le délai spécifié, IlluminateContractsCacheLockTimeoutException
sera levée : 🎜rrreee🎜🎜Gérer les verrous inter-processus🎜🎜 Parfois, vous souhaitez acquérir un verrou dans un processus et le libérer dans un autre processus. Par exemple, vous pouvez acquérir un verrou lors d'une requête Web et vouloir le libérer à la fin de la tâche en file d'attente déclenchée par cette requête. Dans ce cas, vous devez transmettre le "jeton de propriétaire" de la portée du verrou au travail en file d'attente afin que le travail puisse ré-instancier le verrou avec le jeton donné : 🎜rrreee🎜 Si vous souhaitez faire cela sans respecter le propriétaire actuel du verrou, libérer le verrou, vous pouvez utiliser la méthode forceRelease
: 🎜rrreee🎜🎜🎜🎜🎜🎜Fonction d'assistance de cache
En plus d'utiliser le contrat Cache
Façade ou Cache, vous pouvez également utiliser la fonction d'assistance globale cache
pour obtenir et enregistrer les données du cache. Lorsque la fonction cache
n'accepte qu'un paramètre chaîne, elle renverra la valeur correspondant à la clé donnée : Cache
Facade 或 Cache 契约 外,你还可以使用全局辅助函数 cache
来获取和保存缓存数据。当 cache
函数只接收一个字符串参数的时候,它将会返回给定键对应的值:
rrreee如果你向函数提供了一组键值对和过期时间,它将会在指定时间内缓存数据:
rrreee当 cache
函数在没有任何参数的情况下被调用时,它返回一个 IlluminateContractsCacheFactory
实现的实例,允许你调用其它缓存方法:
rrreee{tip} 如果在测试中使用全局辅助函数 cache
,你可以使用 Cache::shouldReceive
方法就像 测试 Facade。
缓存标记
{note} 缓存标记不支持使用 file
和 database
缓存驱动。此外,当使用多个缓存标记的缓存设置为「永久」时,类似 memcached
的缓存驱动性能最佳,它会自动清除旧的记录。
写入被标记的缓存数据
缓存标记允许你给缓存相关进行标记,以便后续清除这些缓存值。你可以通过传入标记名称的有序数组来访问标记的缓存。例如,我们可以使用标记的同时使用 put
方法设置缓存。
rrreee访问被标记的缓存数据
若要获取一个被标记的缓存数据,请将相同的有序标记数组传递给 tags
方法,然后调用 get
方法来获取你要检索的键:
rrreee移除被标记的缓存数据
你可以清空有单个标记或是一组标记的所有缓存数据。例如,下面的语句会被标记为 people
,authors
或两者都有的缓存。所以,Anne
和 John
都会从缓存中被删除:
rrreee相反,下面的语句只会删除被标记 authors
的缓存,所以 Anne
会被删除,但 John
rrreee
Si vous fournissez à la fonction un ensemble de paires clé-valeur et un délai d'expiration, elle will Mettra en cache les données pendant une durée spécifiée : {tip} Si vous utilisez la fonction d'assistance globale cache
dans vos tests, vous pouvez utiliser la méthode Cache::shouldReceive
tout comme la méthode tester Façade. {note} L'utilisation des balises de cache n'est pas pris en charge par les pilotes de cache file
et database
. De plus, un pilote de cache tel que memcached
fonctionne mieux lorsque le cache utilisant plusieurs balises de cache est défini sur « persistant », ce qui efface automatiquement les anciens enregistrements. 🎜🎜🎜🎜Écrire des données de cache balisées🎜🎜Cache tag Vous permet de marquez les valeurs mises en cache afin qu'elles puissent être effacées ultérieurement. Vous pouvez accéder au cache des balises en transmettant un tableau ordonné de noms de balises. Par exemple, nous pouvons définir le cache en utilisant la méthode put
avec la balise. 🎜rrreee🎜🎜🎜🎜🎜Accéder aux données du cache balisées🎜🎜Pour obtenir un cache balisé Pour mettre en cache les données , transmettez le même tableau ordonné de balises à la méthode tags
, puis appelez la méthode get
pour obtenir la clé que vous souhaitez récupérer : 🎜rrreee🎜🎜🎜🎜🎜Suppression des données de cache balisées🎜🎜Vous pouvez effacer une seule balise ou un groupe de balises Toutes les données mises en cache. Par exemple, l'instruction suivante serait mise en cache sous les noms people
, authors
ou les deux. Par conséquent, Anne
et John
seront supprimés du cache : 🎜rrreee🎜En revanche, l'instruction suivante supprimera uniquement le cache marqué auteurs
, Donc Anne
sera supprimé, mais John
ne le sera pas : 🎜rrreee🎜🎜🎜🎜🎜🎜🎜Ajouter un pilote de cache personnalisé🎜🎜🎜🎜🎜🎜🎜Écriture du pilote
Pour créer un pilote de cache personnalisé, vous devez d'abord implémenter le contrat IlluminateContractsCacheStore
. Par conséquent, l'implémentation du cache de MongoDB ressemblera à ceci : IlluminateContractsCacheStore
契约。因此, MongoDB 的缓存实现看起来会像这样:
rrreee我们只需要 MongoDB 的连接来实现这些方法。关于如何实现这些方法的实例,可以参阅框架源代码中的 IlluminateCacheMemcachedStore
。一旦完成契约额实现后,就可以像下面这样完成自定义驱动的注册了。
rrreee{tip} 如果你不知道将缓存驱动代码放在哪,你可以在 app
目录下创建一个 Extensions
命名空间。然而,Laravel 并没有硬性规定应用程序的结构,你可以根据自己的喜好自由组织你的应用程序。
注册驱动
要使用 Laravel 来注册自定义缓存驱动,就要在 Cache
Facade 上使用 extend
方法。 对 Cache::extend
的调用可以在新的 Laravel 应用程序中自带的 AppProvidersAppServiceProvider
的 boot
方法中完成,或者你也可以创建自己的服务提供者来存放扩展,只是不要忘记在 config/app.php
的 provider 数组中注册服务提供者:
rrreee传递给 extend
方法的第一个参数是驱动程序的名称。这将与 config/cache.php
配置文件的 driver
选项相对应。第二个参数是一个应该返回 IlluminateCacheRepository
实例的闭包。该闭包将传递一个 服务容器 的 $app
实例。
一旦你的扩展程序注册后,需要将 config/cache.php
配置文件中的 driver
选项更新为你的扩展名称。
事件
要在每次缓存操作时执行代码,你可以监听缓存触发的 事件 。通常,你应该将这些事件监听器放在 EventServiceProvider
rrreee
Nous n'avons besoin que de la connexion MongoDB pour implémenter ces méthodes. Pour des exemples d'implémentation de ces méthodes, consultez IlluminateCacheMemcachedStore
dans le code source du framework. Une fois le contrat complété, vous pouvez finaliser l'enregistrement du chauffeur personnalisé comme suit. 🎜🎜🎜Enregistrement du pilote🎜🎜Pour utiliser Laravel pour enregistrer un cache personnalisé driver , vous devez utiliser la méthode extend
sur la façade Cache
. L'appel à Cache::extend
peut être effectué dans la méthode boot
du AppProvidersAppServiceProvider
fourni avec la nouvelle application Laravel, ou vous pouvez créer votre propre fournisseur de services pour stocker les extensions, n'oubliez pas d'enregistrer le fournisseur de services dans le tableau des fournisseurs de config/app.php
: 🎜rrreee🎜 passé au extend
méthode Le premier paramètre est le nom du pilote. Cela correspondra à l'option driver
du fichier de configuration config/cache.php
. Le deuxième paramètre est une fermeture qui doit renvoyer une instance de IlluminateCacheRepository
. La fermeture recevra une instance $app
du conteneur de service. 🎜🎜Une fois votre extension enregistrée, vous devez mettre à jour l'option driver
dans le fichier de configuration config/cache.php
avec le nom de votre extension. 🎜🎜🎜🎜🎜Événements
🎜Pour exécuter du code à chaque opération de cache, vous pouvez écouter le déclenchement du cache événements. En règle générale, vous devez placer ces écouteurs d'événements dans EventServiceProvider
: 🎜rrreee🎜Cet article est apparu pour la première fois sur le site Web 🎜LearnKu.com🎜. 🎜🎜
put
du Cache
Façade pour mettre le data Store dans le cache : 🎜cache(['key' => 'value'], $seconds); cache(['key' => 'value'], now()->addMinutes(10));🎜 Si le délai d'expiration mis en cache n'est pas transmis à la méthode
put
, le cache sera valide pour toujours : 🎜cache()->remember('users', $seconds, function () { return DB::table('users')->get(); });🎜En plus de passer l'expiration time en secondes sous forme d'entier, vous pouvez également passer une instance
DateTime
pour représenter l'heure d'expiration des données : 🎜Cache::tags(['people', 'artists'])->put('John', $john, $seconds); Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);
Stocker uniquement les données qui n'existent pas
🎜< La méthode code>add stockera uniquement les données qui n'existent pas dans le cache. Si le stockage réussit,true
sera renvoyé, sinon false
sera renvoyé : 🎜$john = Cache::tags(['people', 'artists'])->get('John'); $anne = Cache::tags(['people', 'authors'])->get('Anne');🎜🎜La méthode
Stockage permanent des données
forever
peut être utilisée pour stocker de manière persistante des données dans le cache. Parce que ces données n'expireront pas, elles doivent être supprimées manuellement du cache via la méthode forget
: forever
方法可用于持久化将数据存储到缓存中。因为这些数据不会过期,所以必须通过 forget
方法从缓存中手动删除它们:
Cache::tags(['people', 'authors'])->flush();
{tip} 如果你使用 Memcached 驱动,当缓存数据达到存储上限时,「永久存储」 的数据可能会被删除。
删除缓存中的数据
你可以使用 forget
方法从缓存中删除这些数据:
Cache::tags('authors')->flush();
你也可以通过提供零或者负的 TTL 值删除这些数据:
<?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() {} }
你可以使用 flush
方法清空所有的缓存:
Cache::extend('mongo', function ($app) { return Cache::repository(new MongoStore); });
{note} 清空缓存的方法并不会考虑缓存前缀,会将缓存中的所有内容删除。因此在清除与其它应用程序共享的缓存时,请慎重考虑。
原子锁
{note} 要使用该特性,你的应用必须使用
memcached
,dynamodb
或redis
缓存驱动作为你应用的默认缓存驱动。此外,所有服务器必须与同一中央缓存服务器进行通信。
原子锁允许对分布式锁进行操作而不必担心竞争条件。例如, Laravel Forge 使用原子锁来确保在一台服务器上每次只有一个远程任务在执行。你可以使用 Cache::lock
方法来创建和管理锁:
<?php namespace App\Providers;use App\Extensions\MongoStore; use Illuminate\Support\Facades\Cache; use Illuminate\Support\ServiceProvider; class CacheServiceProvider extends ServiceProvider{ /** * 执行服务的注册后引导。 * * @return void */ public function boot() { Cache::extend('mongo', function ($app) { return Cache::repository(new MongoStore); }); } /** * 在容器中注册绑定。 * * @return void */ public function register() { // } }
get
方法也可以接收一个闭包。在闭包执行之后,Laravel 将会自动释放锁:
/** * 应用的事件监听器映射 * * @var array */ protected $listen = [ 'Illuminate\Cache\Events\CacheHit' => [ 'App\Listeners\LogCacheHit', ], 'Illuminate\Cache\Events\CacheMissed' => [ 'App\Listeners\LogCacheMissed', ], 'Illuminate\Cache\Events\KeyForgotten' => [ 'App\Listeners\LogKeyForgotten', ], 'Illuminate\Cache\Events\KeyWritten' => [ 'App\Listeners\LogKeyWritten', ], ];
如果你在请求时锁无法使用,你可以控制 Laravel 等待指定的秒数。如果在指定的时间限制内无法获取锁,则会抛出 IlluminateContractsCacheLockTimeoutException
:
管理跨进程的锁
有时,你希望在一个进程中获取锁并在另外一个进程中释放它。例如,你可以在 Web 请求期间获取锁,并希望在该请求触发的队列作业结束时释放锁。在这种情况下,你应该将锁的作用域「owner token」传递给队列作业,以便作业可以使用给定的 token 重新实例化锁:
rrreee如果你想在不尊重当前锁的所有者的情况下释放锁,你可以使用 forceRelease
rrreee
{tip} Si vous utilisez le pilote Memcached, lorsque les données mises en cache atteignent le stockage limite, " Les données stockées de manière permanente peuvent être supprimées.
Supprimer des données du cache h3>
forget
: 🎜rrreee🎜Vous pouvez également supprimer ces données en fournissant une valeur TTL nulle ou négative : 🎜rrreee🎜Vous pouvez utiliser flush
Méthode pour vider tous les caches : 🎜rrreee🎜{note} La méthode de vider le cache ne prend pas en compte le préfixe du cache et supprimera tout le contenu du cache. Veuillez donc réfléchir attentivement lorsque vous videz le cache partagé avec d'autres applications. 🎜🎜🎜🎜
Serrures atomiques
🎜{note} Pour utiliser cette fonctionnalité, votre application doit utiliser le pilote de cache🎜Les verrous atomiques permettent d'effectuer des opérations sur des verrous distribués sans se soucier des conditions de concurrence. Par exemple, Laravel Forge🎜 utilise des verrous atomiques pour garantir qu'une seule tâche distante est exécutée sur un serveur à la fois. Vous pouvez utiliser la méthodememcached
,dynamodb
ouredis
comme pilote de cache par défaut de votre application. De plus, tous les serveurs doivent communiquer avec le même serveur de cache central. 🎜
Cache::lock
pour créer et gérer des verrous : 🎜rrreee🎜 La méthode get
peut également recevoir une fermeture. Une fois la fermeture exécutée, Laravel libérera automatiquement le verrou : 🎜rrreee🎜 Si le verrou n'est pas disponible au moment de votre demande, vous pouvez contrôler Laravel pour qu'il attende un nombre de secondes spécifié. Si le verrou ne peut pas être acquis dans le délai spécifié, IlluminateContractsCacheLockTimeoutException
sera levée : 🎜rrreeeforceRelease
: 🎜rrreee🎜🎜🎜🎜🎜🎜Fonction d'assistance de cache
En plus d'utiliser le contrat Cache
Façade ou Cache, vous pouvez également utiliser la fonction d'assistance globale cache
pour obtenir et enregistrer les données du cache. Lorsque la fonction cache
n'accepte qu'un paramètre chaîne, elle renverra la valeur correspondant à la clé donnée : Cache
Facade 或 Cache 契约 外,你还可以使用全局辅助函数 cache
来获取和保存缓存数据。当 cache
函数只接收一个字符串参数的时候,它将会返回给定键对应的值:
如果你向函数提供了一组键值对和过期时间,它将会在指定时间内缓存数据:
rrreee当 cache
函数在没有任何参数的情况下被调用时,它返回一个 IlluminateContractsCacheFactory
实现的实例,允许你调用其它缓存方法:
{tip} 如果在测试中使用全局辅助函数
cache
,你可以使用Cache::shouldReceive
方法就像 测试 Facade。
缓存标记
{note} 缓存标记不支持使用
file
和database
缓存驱动。此外,当使用多个缓存标记的缓存设置为「永久」时,类似memcached
的缓存驱动性能最佳,它会自动清除旧的记录。
写入被标记的缓存数据
缓存标记允许你给缓存相关进行标记,以便后续清除这些缓存值。你可以通过传入标记名称的有序数组来访问标记的缓存。例如,我们可以使用标记的同时使用 put
方法设置缓存。
访问被标记的缓存数据
若要获取一个被标记的缓存数据,请将相同的有序标记数组传递给 tags
方法,然后调用 get
方法来获取你要检索的键:
移除被标记的缓存数据
你可以清空有单个标记或是一组标记的所有缓存数据。例如,下面的语句会被标记为 people
,authors
或两者都有的缓存。所以,Anne
和 John
都会从缓存中被删除:
相反,下面的语句只会删除被标记 authors
的缓存,所以 Anne
会被删除,但 John
rrreee
{tip} Si vous utilisez la fonction d'assistance globalecache
dans vos tests, vous pouvez utiliser la méthodeCache::shouldReceive
tout comme la méthode tester Façade.{note} L'utilisation des balises de cache n'est pas pris en charge par les pilotes de cachefile
etdatabase
. De plus, un pilote de cache tel quememcached
fonctionne mieux lorsque le cache utilisant plusieurs balises de cache est défini sur « persistant », ce qui efface automatiquement les anciens enregistrements. 🎜🎜🎜🎜Écrire des données de cache balisées🎜🎜Cache tag Vous permet de marquez les valeurs mises en cache afin qu'elles puissent être effacées ultérieurement. Vous pouvez accéder au cache des balises en transmettant un tableau ordonné de noms de balises. Par exemple, nous pouvons définir le cache en utilisant la méthodeput
avec la balise. 🎜rrreee🎜🎜🎜🎜🎜Accéder aux données du cache balisées🎜🎜Pour obtenir un cache balisé Pour mettre en cache les données , transmettez le même tableau ordonné de balises à la méthodetags
, puis appelez la méthodeget
pour obtenir la clé que vous souhaitez récupérer : 🎜rrreee🎜🎜🎜🎜🎜Suppression des données de cache balisées🎜🎜Vous pouvez effacer une seule balise ou un groupe de balises Toutes les données mises en cache. Par exemple, l'instruction suivante serait mise en cache sous les noms🎜people
,authors
ou les deux. Par conséquent,Anne
etJohn
seront supprimés du cache : 🎜rrreee🎜En revanche, l'instruction suivante supprimera uniquement le cache marquéauteurs
, DoncAnne
sera supprimé, maisJohn
ne le sera pas : 🎜rrreee🎜🎜🎜🎜🎜🎜🎜Ajouter un pilote de cache personnalisé🎜🎜🎜🎜🎜🎜🎜Écriture du pilote
Pour créer un pilote de cache personnalisé, vous devez d'abord implémenter le contrat
rrreeeIlluminateContractsCacheStore
. Par conséquent, l'implémentation du cache de MongoDB ressemblera à ceci :IlluminateContractsCacheStore
契约。因此, MongoDB 的缓存实现看起来会像这样:我们只需要 MongoDB 的连接来实现这些方法。关于如何实现这些方法的实例,可以参阅框架源代码中的
rrreeeIlluminateCacheMemcachedStore
。一旦完成契约额实现后,就可以像下面这样完成自定义驱动的注册了。{tip} 如果你不知道将缓存驱动代码放在哪,你可以在
app
目录下创建一个Extensions
命名空间。然而,Laravel 并没有硬性规定应用程序的结构,你可以根据自己的喜好自由组织你的应用程序。注册驱动
要使用 Laravel 来注册自定义缓存驱动,就要在
rrreeeCache
Facade 上使用extend
方法。 对Cache::extend
的调用可以在新的 Laravel 应用程序中自带的AppProvidersAppServiceProvider
的boot
方法中完成,或者你也可以创建自己的服务提供者来存放扩展,只是不要忘记在config/app.php
的 provider 数组中注册服务提供者:传递给
extend
方法的第一个参数是驱动程序的名称。这将与config/cache.php
配置文件的driver
选项相对应。第二个参数是一个应该返回IlluminateCacheRepository
实例的闭包。该闭包将传递一个 服务容器 的$app
实例。一旦你的扩展程序注册后,需要将
config/cache.php
配置文件中的driver
选项更新为你的扩展名称。事件
要在每次缓存操作时执行代码,你可以监听缓存触发的 事件 。通常,你应该将这些事件监听器放在
Nous n'avons besoin que de la connexion MongoDB pour implémenter ces méthodes. Pour des exemples d'implémentation de ces méthodes, consultezEventServiceProvider
rrreeeIlluminateCacheMemcachedStore
dans le code source du framework. Une fois le contrat complété, vous pouvez finaliser l'enregistrement du chauffeur personnalisé comme suit.🎜🎜Enregistrement du pilote🎜🎜Pour utiliser Laravel pour enregistrer un cache personnalisé driver , vous devez utiliser la méthodeextend
sur la façadeCache
. L'appel àCache::extend
peut être effectué dans la méthodeboot
duAppProvidersAppServiceProvider
fourni avec la nouvelle application Laravel, ou vous pouvez créer votre propre fournisseur de services pour stocker les extensions, n'oubliez pas d'enregistrer le fournisseur de services dans le tableau des fournisseurs deconfig/app.php
: 🎜rrreee🎜 passé auextend
méthode Le premier paramètre est le nom du pilote. Cela correspondra à l'optiondriver
du fichier de configurationconfig/cache.php
. Le deuxième paramètre est une fermeture qui doit renvoyer une instance deIlluminateCacheRepository
. La fermeture recevra une instance$app
du conteneur de service. 🎜🎜Une fois votre extension enregistrée, vous devez mettre à jour l'optiondriver
dans le fichier de configurationconfig/cache.php
avec le nom de votre extension. 🎜🎜🎜🎜🎜Événements
🎜Pour exécuter du code à chaque opération de cache, vous pouvez écouter le déclenchement du cache événements. En règle générale, vous devez placer ces écouteurs d'événements dansEventServiceProvider
: 🎜rrreee🎜Cet article est apparu pour la première fois sur le site Web 🎜LearnKu.com🎜. 🎜🎜