캐싱 시스템


ㅋㅋ                                                    

캐싱 시스템

구성

Laravel은 다양한 백엔드 캐시를 위한 풍부하고 통합된 API 및 해당 구성 정보 config/cache.php 파일에 있습니다. 이 파일에서 애플리케이션이 기본적으로 사용하는 캐시 드라이버를 지정할 수 있습니다. Laravel은 Memcachedconfig/cache.php 文件中。在该文件中你可以指定应用默认使用哪个缓存驱动。Laravel 支持当前流行的后端缓存,例如 MemcachedRedis

缓存配置文件还包含各种其他选项,这些选项都记录在文件中,因此请确保阅读这些选项。默认情况下,Laravel 配置为使用 fileRedis

와 같은 인기 있는 백엔드 캐시를 지원합니다.

캐시 구성 파일에는 파일에 문서화되어 있는 다양한 기타 옵션도 포함되어 있으므로 꼭 읽어보세요. 기본적으로 Laravel은 파일 시스템에 직렬화된 캐시 객체를 저장하는 file 캐시 드라이버를 사용하도록 구성되어 있습니다. 대규모 애플리케이션의 경우 Memcached 또는 Redis와 같은 보다 강력한 드라이버를 사용하는 것이 좋습니다. 동일한 드라이버에 대해 여러 캐시 구성을 구성할 수도 있습니다.

운전 전제조건🎜🎜🎜

Database

데이터베이스 캐시 드라이버를 사용하는 경우 캐시 데이터를 저장할 테이블을 구성해야 합니다. 다음은 캐시 데이터 테이블 구조를 구축하기 위한 스키마 선언의 예입니다: 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 文档。

缓存的使用

获取缓存实例

IlluminateContractsCacheFactoryIlluminateContractsCacheRepository 契约 提供了 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} Artisan 명령 php artisan 캐시:table를 사용하여 적절한 마이그레이션을 생성합니다.

Memcached

Memcached 드라이버를 사용하려면 설치가 필요합니다. Memcached PECL 확장 패키지
. config/cache.php 구성 파일에서 모든 Memcached 서버를 나열할 수 있습니다. 🎜
$value = Cache::get('key');
$value = Cache::get('key', 'default');
🎜 host 옵션을 UNIX 소켓 경로로 설정할 수 있습니다. 이런 방식으로 구성하는 경우 port 옵션을 0으로 설정해야 합니다: 🎜
$value = Cache::get('key', function () {
    return DB::table(...)->get();
 });
🎜🎜Redis 🎜🎜 Laravel의 Redis 캐시를 사용하기 전에 Composer를 통해 predis/predis 확장 패키지(~1.0)를 설치하거나 PECL을 사용하여 PhpRedis PHP 확장을 설치해야 합니다. 🎜🎜Redis 구성에 대해 자세히 알아보려면 Laravel Redis 설명서를 참조하세요. 🎜🎜🎜🎜
🎜

캐시 사용량

🎜
🎜🎜
🎜

캐시 인스턴스 가져오기

🎜IlluminateContractsCacheFactoryIlluminateContractsCacheRepository 계약은 Laravel의 캐시 서비스에 대한 액세스 메커니즘을 제공합니다. Factory 계약은 애플리케이션이 모든 캐시 드라이버에 액세스하는 메커니즘을 정의합니다. 저장소 계약은 일반적으로 cache 구성 파일에 지정된 기본 캐시 드라이버에 의해 구현됩니다. 🎜🎜그러나 Cache Facade를 사용할 수도 있으며, 이에 대해서는 후속 문서에서 소개하겠습니다. 캐시 Facade는 Laravel 캐시 계약의 기본 구현을 위한 편리하고 간결한 방법을 제공합니다. 🎜
if (Cache::has('key')) { 
   //
}
🎜🎜여러 캐시 저장소에 액세스🎜🎜 사용 Cache Facade에서는 store 메소드를 통해 다양한 캐시 저장소에 접근할 수 있습니다. store 메소드에 전달된 키는 cache 구성 정보 파일의 stores 구성 배열에 나열된 저장소 중 하나와 일치해야 합니다: 🎜
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
🎜🎜 🎜🎜🎜🎜

Get data from 캐시

Cache Facade의 get 메소드는 캐시에서 데이터를 가져오는 데 사용되는 메소드입니다. 캐시에 데이터가 없으면 메서드는 null 을 반환합니다. 짐작할 수 있듯이 두 번째 매개변수를 get 메서드에 전달할 수도 있습니다. 이 매개변수는 조회 중인 데이터가 존재하지 않는 경우 반환하려는 기본값을 지정합니다. 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 方法可以用于判断缓存项是否存在。如果为 nullfalse 则该方法将会返回 false

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

递增与递减值

incrementdecrement 方法可以用来调整缓存中整数项的值。这两个方法都可以传入第二个可选参数,这个参数用来指明要递增或递减的数量:

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();

< code>클로저
를 기본값으로 설정합니다. 지정된 데이터가 캐시에 없으면 Closure 결과가 반환됩니다. 클로저 메소드를 전달하면 데이터베이스나 기타 외부 서비스에서 기본값을 가져올 수 있습니다:
use Illuminate\Support\Facades\Cache;
$lock = Cache::lock('foo', 10);
if ($lock->get()) {
    //获取锁定10秒...    
    $lock->release();
}

캐시된 항목이 있는지 확인

🎜 < The code>has 메소드를 사용하여 캐시 항목이 존재하는지 확인할 수 있습니다. null 또는 false인 경우 이 메서드는 false를 반환합니다. 🎜
Cache::lock('foo')->get(function () {
    // 获取无限期锁并自动释放...
});
🎜

값 증가 및 감소

🎜증가감소 방법을 사용하여 캐시에 있는 정수 항목의 값을 조정할 수 있습니다. 두 메소드 모두 증가하거나 감소할 양을 지정하는 데 사용되는 두 번째 선택적 매개변수를 전달할 수 있습니다. 🎜
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秒后获取的锁...
   });
🎜

Get the sum Storage🎜때때로 캐시에서 데이터를 얻고 싶을 때가 있는데, 요청한 캐시 항목이 존재하지 않는 경우 프로그램이 기본값을 저장할 수 있습니다. 예를 들어 캐시에서 모든 사용자를 가져오려고 할 수 있습니다. 이러한 사용자가 캐시에 없으면 프로그램은 데이터베이스에서 해당 사용자를 가져와서 캐시에 넣습니다. 이를 달성하려면 Cache::remember 메서드를 사용할 수 있습니다. 🎜
// 控制器里面...
$podcast = Podcast::find($id);
if ($lock = Cache::lock('foo', 120)->get()) {
    ProcessPodcast::dispatch($podcast, $lock->owner());
    }
// ProcessPodcast Job 里面...
Cache::restoreLock('foo', $this->owner)->release();
🎜원하는 데이터가 캐시에 없으면 해당 데이터를 remember<의 클로저에 전달하세요. /code> 메소드 패키지가 실행되고 해당 결과가 반환되어 캐시에 저장됩니다. 🎜🎜rememberForever 메소드를 사용하여 캐시에서 데이터를 가져오거나 영구적으로 저장할 수 있습니다. 🎜
Cache::lock('foo')->forceRelease();
🎜

가져오기 및 delete🎜캐시에서 데이터를 가져온 후 삭제해야 하는 경우 pull 메서드를 사용할 수 있습니다. get 메소드와 마찬가지로 캐시가 없으면 null이 반환됩니다. 🎜
$value = cache('key');
🎜< /a >🎜
🎜🎜캐시에 데이터를 저장하세요🎜🎜캐시put 메소드를 사용할 수 있습니다 > 데이터를 캐시에 저장하는 Facade: 🎜
cache(['key' => 'value'], $seconds);
cache(['key' => 'value'], now()->addMinutes(10));
🎜 캐시된 만료 시간이 put 메서드에 전달되지 않으면 캐시는 영원히 유효합니다. 🎜
cache()->remember('users', $seconds, function () {
    return DB::table('users')->get();
 });
🎜 만료 시간을 전달하는 것 외에도 시간(초)을 정수로 전달하면 DateTime 인스턴스를 전달하여 데이터 만료 시간을 나타낼 수도 있습니다. 🎜
Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);
🎜

존재하지 않는 데이터만 저장

🎜< code>add
메소드는 캐시에 존재하지 않는 데이터만 저장합니다. 저장에 성공하면 true가 반환되고, 그렇지 않으면 false가 반환됩니다. 🎜
$john = Cache::tags(['people', 'artists'])->get('John');
$anne = Cache::tags(['people', 'authors'])->get('Anne');
🎜🎜

데이터 영구 저장

영원히 방법을 사용하면 데이터를 캐시에 지속적으로 저장할 수 있습니다. 이러한 데이터는 만료되지 않으므로 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} 要使用该特性,你的应用必须使用 memcacheddynamodbredis 缓存驱动作为你应用的默认缓存驱动。此外,所有服务器必须与同一中央缓存服务器进行通信。

原子锁允许对分布式锁进行操作而不必担心竞争条件。例如, 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

如果你想在不尊重当前锁的所有者的情况下释放锁,你可以使用 forceReleaserrreee

{tip} Memcached 드라이버를 사용하는 경우 캐시된 데이터가 스토리지에 도달하면 제한, " 영구 저장된 데이터는 삭제될 수 있습니다.

캐시에서 데이터 제거

forget 메소드를 사용하여 캐시에서 이 데이터를 삭제할 수 있습니다: 🎜rrreee🎜0 또는 음수 TTL 값을 제공하여 이 데이터를 삭제할 수도 있습니다: 🎜rrreee🎜를 사용할 수 있습니다 플러시 모든 캐시를 지우는 방법: 🎜rrreee
🎜{note} 캐시를 지우는 방법은 캐시 접두어를 고려하지 않으며 캐시의 모든 콘텐츠를 삭제합니다. 따라서 다른 애플리케이션과 공유된 캐시를 삭제할 때는 신중하게 고려하시기 바랍니다. 🎜
🎜🎜🎜
🎜

원자 잠금

🎜{note} 이 기능을 사용하려면 애플리케이션이 memcached, dynamodb 또는 redis 캐시 드라이버를 애플리케이션의 기본 캐시 드라이버로 사용해야 합니다. 또한 모든 서버는 동일한 중앙 캐시 서버와 통신해야 합니다. 🎜
🎜원자 잠금을 사용하면 경쟁 조건을 걱정하지 않고 분산 잠금에 대한 작업을 수행할 수 있습니다. 예를 들어
Laravel Forge🎜는 원자 잠금을 사용하여 서버에서 한 번에 하나의 원격 작업만 실행되도록 합니다. Cache::lock 메서드를 사용하여 잠금을 생성하고 관리할 수 있습니다. 🎜rrreee🎜 get 메서드도 클로저를 수신할 수 있습니다. 클로저가 실행된 후 Laravel은 자동으로 잠금을 해제합니다: 🎜rrreee🎜 요청 시 잠금을 사용할 수 없는 경우 Laravel이 지정된 시간(초) 동안 기다리도록 제어할 수 있습니다. 지정된 시간 제한 내에 잠금을 획득할 수 없는 경우 IlluminateContractsCacheLockTimeoutException이 발생합니다: 🎜rrreee
🎜🎜크로스 프로세스 잠금 관리🎜🎜 때로는 한 프로세스에서 잠금을 획득하고 다른 프로세스에서 잠금을 해제하려는 경우가 있습니다. 예를 들어 웹 요청 중에 잠금을 획득하고 해당 요청에 의해 트리거된 대기열 작업이 끝나면 잠금을 해제하려고 할 수 있습니다. 이 경우 작업이 지정된 토큰으로 잠금을 다시 인스턴스화할 수 있도록 잠금 범위 "소유자 토큰"을 대기열 작업에 전달해야 합니다. 🎜rrreee🎜 현재 잠금 소유자를 존중하지 않고 이 작업을 수행하려면 해제하려면 잠금을 해제하려면 forceRelease 메소드를 사용할 수 있습니다: 🎜rrreee🎜🎜🎜🎜🎜🎜

캐시 도우미 기능

캐시 Facade 또는 캐시 계약을 사용하는 것 외에도 전역 도우미 기능 cache를 사용하여 캐시 데이터를 얻고 저장할 수도 있습니다. cache 함수가 문자열 매개변수만 허용하는 경우 지정된 키에 해당하는 값을 반환합니다. Cache Facade 或 Cache 契约 外,你还可以使用全局辅助函数 cache 来获取和保存缓存数据。当 cache 函数只接收一个字符串参数的时候,它将会返回给定键对应的值:

rrreee

如果你向函数提供了一组键值对和过期时间,它将会在指定时间内缓存数据:

rrreee

cache 函数在没有任何参数的情况下被调用时,它返回一个 IlluminateContractsCacheFactory 实现的实例,允许你调用其它缓存方法:

rrreee

{tip} 如果在测试中使用全局辅助函数 cache ,你可以使用 Cache::shouldReceive 方法就像 测试 Facade。

缓存标记

{note} 缓存标记不支持使用 filedatabase 缓存驱动。此外,当使用多个缓存标记的缓存设置为「永久」时,类似 memcached 的缓存驱动性能最佳,它会自动清除旧的记录。

写入被标记的缓存数据

缓存标记允许你给缓存相关进行标记,以便后续清除这些缓存值。你可以通过传入标记名称的有序数组来访问标记的缓存。例如,我们可以使用标记的同时使用 put 方法设置缓存。

rrreee

访问被标记的缓存数据

若要获取一个被标记的缓存数据,请将相同的有序标记数组传递给 tags 方法,然后调用 get 方法来获取你要检索的键:

rrreee

移除被标记的缓存数据

你可以清空有单个标记或是一组标记的所有缓存数据。例如,下面的语句会被标记为 peopleauthors 或两者都有的缓存。所以,AnneJohn 都会从缓存中被删除:

rrreee

相反,下面的语句只会删除被标记 authors 的缓存,所以 Anne 会被删除,但 Johnrrreee

함수에 키-값 쌍 집합과 만료 시간을 제공하면 지정된 시간 동안 데이터를 캐시합니다:

rrreee cache 함수가 매개변수 없이 호출되면 IlluminateContractsCacheFactory 구현의 인스턴스를 반환하므로 Other를 호출할 수 있습니다. 캐싱 방법: rrreee

{tip} 테스트에서 전역 도우미 함수 cache를 사용하는 경우 Cache::shouldReceive 메서드를 다음과 같이 사용할 수 있습니다. 테스트 외관.

Cache Tags

{note} 캐시 태그 사용 파일데이터베이스 캐시 드라이버는 지원되지 않습니다. 또한 memcached와 같은 캐시 드라이버는 여러 캐시 태그를 사용하는 캐시가 "지속"으로 설정되어 오래된 레코드를 자동으로 지울 때 가장 잘 작동합니다.
🎜🎜
🎜🎜태그된 캐시 데이터 쓰기🎜🎜캐시 태그를 사용하면 다음을 수행할 수 있습니다. 나중에 지울 수 있도록 캐시된 값을 표시합니다. 태그 이름의 정렬된 배열을 전달하여 태그 캐시에 액세스할 수 있습니다. 예를 들어, 태그와 함께 put 메소드를 사용하여 캐시를 설정할 수 있습니다. 🎜rrreee🎜🎜🎜
🎜🎜태그된 캐시 데이터에 액세스🎜🎜태그된 캐시를 얻으려면 데이터를 캐시하려면 , 동일한 순서의 태그 배열을 tags 메서드에 전달한 다음 get 메서드를 호출하여 검색하려는 키를 가져옵니다. 🎜rrreee🎜🎜🎜
🎜🎜태그된 캐시 데이터 제거🎜🎜단일 태그 또는 태그 그룹을 지울 수 있습니다. 모든 캐시된 데이터입니다. 예를 들어 다음 문은 people, authors 또는 둘 다로 캐시됩니다. 따라서 AnneJohn은 모두 캐시에서 삭제됩니다. 🎜rrreee🎜반면, 다음 명령문은 authors로 표시된 캐시만 삭제합니다. , 따라서 Anne은 삭제되지만 John은 삭제되지 않습니다. 🎜rrreee🎜🎜🎜🎜🎜🎜🎜사용자 정의 캐시 드라이버 추가🎜🎜🎜🎜🎜🎜🎜

드라이버 작성

사용자 정의 캐시 드라이버를 생성하려면 먼저 IlluminateContractsCacheStore 계약을 구현해야 합니다. 따라서 MongoDB의 캐시 구현은 다음과 같습니다. IlluminateContractsCacheStore 契约。因此, MongoDB 的缓存实现看起来会像这样:

rrreee

我们只需要 MongoDB 的连接来实现这些方法。关于如何实现这些方法的实例,可以参阅框架源代码中的 IlluminateCacheMemcachedStore 。一旦完成契约额实现后,就可以像下面这样完成自定义驱动的注册了。

rrreee

{tip} 如果你不知道将缓存驱动代码放在哪,你可以在 app 目录下创建一个 Extensions 命名空间。然而,Laravel 并没有硬性规定应用程序的结构,你可以根据自己的喜好自由组织你的应用程序。

注册驱动

要使用 Laravel 来注册自定义缓存驱动,就要在 Cache Facade 上使用 extend 方法。 对 Cache::extend 的调用可以在新的 Laravel 应用程序中自带的 AppProvidersAppServiceProviderboot 方法中完成,或者你也可以创建自己的服务提供者来存放扩展,只是不要忘记在 config/app.php 的 provider 数组中注册服务提供者:

rrreee

传递给 extend 方法的第一个参数是驱动程序的名称。这将与 config/cache.php 配置文件的 driver 选项相对应。第二个参数是一个应该返回 IlluminateCacheRepository 实例的闭包。该闭包将传递一个 服务容器 的 $app 实例。

一旦你的扩展程序注册后,需要将 config/cache.php 配置文件中的 driver 选项更新为你的扩展名称。

事件

要在每次缓存操作时执行代码,你可以监听缓存触发的 事件 。通常,你应该将这些事件监听器放在 EventServiceProviderrrreee

이러한 메서드를 구현하려면 MongoDB 연결만 필요합니다. 이러한 메서드를 구현하는 방법에 대한 예는 프레임워크 소스 코드의 IlluminateCacheMemcachedStore를 참조하세요. 계약이 완료되면 다음과 같이 커스텀 드라이버 등록을 완료할 수 있습니다.
🎜
🎜🎜드라이버 등록🎜🎜Laravel을 사용하여 사용자 정의 캐시를 등록하려면 드라이버를 사용하려면 Cache Facade에서 extend 메서드를 사용해야 합니다. Cache::extend에 대한 호출은 새로운 Laravel 애플리케이션과 함께 제공되는 AppProvidersAppServiceProviderboot 메서드에서 수행할 수 있습니다. 확장 프로그램을 저장하려면 서비스 공급자를 config/app.php의 공급자 배열에 등록하는 것을 잊지 마세요. 🎜rrreee🎜가 extend에 전달됩니다. method 첫 번째 매개변수는 드라이버의 이름입니다. 이는 config/cache.php 구성 파일의 driver 옵션에 해당합니다. 두 번째 매개변수는 IlluminateCacheRepository의 인스턴스를 반환해야 하는 클로저입니다. 클로저는 서비스 컨테이너의 $app 인스턴스로 전달됩니다. 🎜🎜확장 프로그램이 등록되면 config/cache.php 구성 파일의 driver 옵션을 확장 프로그램 이름으로 업데이트해야 합니다. 🎜🎜🎜🎜
🎜

이벤트

🎜모든 캐시 작업에서 코드를 실행하려면 캐시 트리거를 들을 수 있습니다. 이벤트. 일반적으로 이러한 이벤트 리스너를 EventServiceProvider에 배치해야 합니다. 🎜rrreee🎜이 기사는 🎜LearnKu.com🎜 웹사이트에 처음 게재되었습니다. 🎜🎜