キャッシングシステム


##キャッシュ システム

構成Laravel は、さまざまなバックエンド API に豊富で統合されたキャッシュを提供します。その構成情報は、

config/cache.php
ファイルにあります。このファイルでは、アプリケーションがデフォルトで使用するキャッシュ ドライバーを指定できます。 Laravel は、
Memcached

Redis

など、現在一般的なバックエンド キャッシュをサポートしています。 キャッシュ構成ファイルには、ファイル内に文書化されている他のさまざまなオプションも含まれているため、これらのオプションを必ずお読みください。デフォルトでは、Laravel は、シリアル化されたキャッシュ オブジェクトをファイル システムに保存する file キャッシュ ドライバーを使用するように構成されています。大規模なアプリケーションの場合は、Memcached や Redis などのより強力なドライバーを使用することをお勧めします。同じドライバーに対して複数のキャッシュ構成を構成することもできます。

ドライバーの前提条件

データベース

データベースキャッシュ ドライバーを使用する場合は、キャッシュ データを保存するテーブルを構成する必要があります。以下は、キャッシュ データ テーブル構造を構築するための 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 拡張パッケージをインストールする必要があります。 config/cache.php 構成ファイルですべての Memcached サーバーをリストできます。

'memcached' => [ 
   [       
    'host' => '127.0.0.1',        
    'port' => 11211,        
    'weight' => 100    
   ],
 ],

host オプションを UNIX ソケット パスに設定できます。このように構成する場合、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 のドキュメントを参照してください。

#キャッシュの使用

Get キャッシュ インスタンス

Illuminate\Contracts\Cache\Factory および Illuminate\Contracts\Cache\Repository コントラクトは、Laravel キャッシュ サービスのアクセス メカニズムを提供します。 Factory コントラクトは、アプリケーションがすべてのキャッシュ ドライバーにアクセスするためのメカニズムを定義します。 リポジトリ コントラクトは通常、cache 構成ファイルで指定されたデフォルトのキャッシュ ドライバーによって実装されます。

ただし、

Cache ファサードを使用することもできます。これについては、後続のドキュメントで紹介します。 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');    
                //  
          }
     }

複数のキャッシュ ストレージへのアクセス

Use

Cache ファサードでは、store メソッドを通じてさまざまなキャッシュ ストアにアクセスできます。 store メソッドに渡されるキーは、cache 構成情報ファイルの stores 構成配列にリストされているストアの 1 つに対応する必要があります:

$value = Cache::store('file')->get('foo');
Cache::store('redis')->put('bar', 'baz', 600); 
// 10 分钟

キャッシュからデータを取得する

Cache Facade の get メソッドは、キャッシュからデータを取得するために使用されるメソッドです。データがキャッシュに存在しない場合、メソッドは null を返します。ご想像のとおり、get メソッドに 2 番目のパラメーターを渡して、検索対象のデータが存在しない場合に返すデフォルト値を指定することもできます。

Closure

もデフォルト値として渡すことができます。指定したデータがキャッシュに存在しない場合は、Closureの結果が返されます。クロージャを渡すメソッドを使用すると、データベースまたは他の外部サービスからデフォルト値を取得できます。

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

キャッシュ項目が存在するかどうかを確認します

has

メソッド キャッシュ項目が存在するかどうかを判断するために使用できます。 null または false の場合、このメソッドは false を返します:

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

値の増減

increment

メソッドと decrement メソッドを使用して、キャッシュ内の整数項目の値を調整できます。どちらのメソッドも、増分または減分する量を指定するために使用される 2 番目のオプションのパラメーターを渡すことができます。キャッシュからデータを取得し、要求されたキャッシュ項目が存在しない場合、プログラムはデフォルト値を保存できます。たとえば、キャッシュからすべてのユーザーを取得したい場合、これらのユーザーがキャッシュに存在しない場合、プログラムはこれらのユーザーをデータベースから取得してキャッシュに置きます。 Cache::remember メソッドを使用すると、これを実現できます。

if (Cache::has('key')) { 
   //
}
必要なデータがキャッシュに存在しない場合は、そのデータを
remember

メソッドに渡します。

クロージャ

が実行され、その結果が返されてキャッシュに配置されます。

rememberForever

メソッドを使用して、キャッシュからデータを取得したり、永続的に保存したりできます:

Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
取得と削除

キャッシュを削除する前にキャッシュからデータを取得する必要がある場合は、pull メソッドを使用できます。

get
メソッドと同様、キャッシュが存在しない場合は、
null

が返されます:

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

キャッシュへのデータの保存

Cache ファサードの

put
メソッドを使用して、データをキャッシュに保存できます:
$value = Cache::rememberForever('users', function () {
    return DB::table('users')->get();
});

キャッシュの有効期限が切れた場合 時間が

put

メソッドに渡されない場合、キャッシュは永久に有効になります:

$value = Cache::pull('key');
有効期限を秒単位で整数として渡すだけでなく、次のこともできます。 DateTime インスタンスも渡します。 データの有効期限を示すには:

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

存在しないデータのみを保存します

add このメソッドは、キャッシュに存在しないデータのみを保存します。保存が成功した場合は

true
が返され、それ以外の場合は
false

が返されます:

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

Data Permanent Storage

forever メソッドを使用すると、データをキャッシュに永続的に保存できます。これらのデータには有効期限がないため、forget メソッドを使用してキャッシュから手動で削除する必要があります:

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

{tip} Memcached ドライバーを使用している場合、キャッシュされたデータがストレージに到達 期間限定で、「永続ストレージ」内のデータが削除される場合があります。

#キャッシュ内のデータを削除します。

forget

を使用できます。 from メソッド キャッシュからこのデータを削除します:

Cache::add('key', 'value', $seconds);
ゼロまたは負の TTL 値を指定して、このデータを削除することもできます:

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

flush

メソッドを使用できます。すべてのキャッシュをクリアするには :

Cache::forget('key');

{note} キャッシュをクリアする方法では、キャッシュ プレフィックスは考慮されず、キャッシュ内のすべてのコンテンツが削除されます。したがって、他のアプリケーションと共有しているキャッシュをクリアする場合は、慎重に検討してください。

Atomic Lock

{note} この機能を使用するには、アプリケーションで次を使用する必要があります。
memcached

dynamodb、または redis キャッシュ ドライバーをアプリケーションのデフォルトのキャッシュ ドライバーとして選択します。さらに、すべてのサーバーが同じ中央キャッシュ サーバーと通信する必要があります。

アトミック ロックを使用すると、競合状態を心配することなく分散ロックの操作が可能になります。たとえば、
Laravel Forge

はアトミック ロックを使用して、サーバー上で一度に 1 つのリモート タスクのみが実行されるようにします。 Cache::lock メソッドを使用してロックを作成および管理できます。

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

get

メソッドはクロージャを受け取ることもできます。クロージャが実行されると、Laravel は自動的にロックを解放します。

Cache::flush();
リクエスト時にロックが利用できない場合は、指定した秒数待機するように Laravel を制御できます。指定された制限時間内にロックを取得できない場合、

Illuminate\Contracts\Cache\LockTimeoutException

がスローされます:

use Illuminate\Support\Facades\Cache;
$lock = Cache::lock('foo', 10);
if ($lock->get()) {
    //获取锁定10秒...    
    $lock->release();
}

プロセス間ロックの管理

あるプロセスでロックを取得し、別のプロセスでロックを解放したい場合があります。たとえば、Web リクエスト中にロックを取得し、そのリクエストによってトリガーされたキュー ジョブが終了したときにロックを解放することができます。この場合、ジョブが指定されたトークンでロックを再インスタンス化できるように、ロックのスコープ「所有者トークン」をキュー ジョブに渡す必要があります。 lock 所有者なしでロックを解放するには、

forceRelease

メソッドを使用できます:

Cache::lock('foo')->get(function () {
    // 获取无限期锁并自动释放...
});

キャッシュ補助関数

Cache ファサードまたはキャッシュ コントラクトの使用に加えて、グローバル補助関数 cache を使用してキャッシュ データを取得および保存することもできます。 。 cache 関数が文字列パラメーターのみを受け取る場合、指定されたキーに対応する値を返します。

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秒后获取的锁...
   });

関数にキーと値のペアと有効期限のセットを指定すると、

// 控制器里面...
$podcast = Podcast::find($id);
if ($lock = Cache::lock('foo', 120)->get()) {
    ProcessPodcast::dispatch($podcast, $lock->owner());
    }
// ProcessPodcast Job 里面...
Cache::restoreLock('foo', $this->owner)->release();

cache 関数がパラメータなしで呼び出されると、Illuminate\Contracts\Cache\ のインスタンスが返されます。他のキャッシュ メソッドを呼び出すことができる Factory 実装:

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

{tip} テストでグローバル ヘルパー関数 cache を使用する場合、## を使用できます。 # Cache:: shouldReceive メソッドは、ファサードのテストに似ています。

#キャッシュ タグ

{注}
を使用したキャッシュ タグはサポートされていません。ファイル

および データベース キャッシュ ドライバー。さらに、memcached のようなキャッシュ ドライバーは、複数のキャッシュ タグを使用するキャッシュが「永続的」に設定されており、古いレコードが自動的に消去される場合に最高のパフォーマンスを発揮します。

#タグ付きキャッシュ データの書き込み
キャッシュ タグを使用すると、キャッシュ関連データにタグを付けることができます。キャッシュされた値は後でクリアできます。タグ名の順序付き配列を渡すことで、タグのキャッシュにアクセスできます。たとえば、タグの使用中に

put

メソッドを使用してキャッシュを設定できます。

$value = cache('key');

マークされたキャッシュ データにアクセスする
マークされたキャッシュ データを取得するには、同じものを変更してください。順序付けられた配列を渡します。のタグを

tags

メソッドに追加し、

get メソッドを呼び出して、取得するキーを取得します:

cache(['key' => 'value'], $seconds);
cache(['key' => 'value'], now()->addMinutes(10));

マークされたキャッシュ データの削除
単一のマークまたはマークのグループを使用して、すべてのキャッシュ データをクリアできます。たとえば、次のステートメントは、

people

authors、またはその両方としてキャッシュされます。したがって、AnneJohn の両方がキャッシュから削除されます:

cache()->remember('users', $seconds, function () {
    return DB::table('users')->get();
 });
対照的に、次のステートメントは、authors## とマークされたキャッシュのみを削除します。 # なので、

Anne

は削除されますが、John は削除されません:

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

カスタム キャッシュ ドライバーを増やす

ドライバーの作成

カスタム キャッシュ ドライバーを作成するには、まず Illuminate\Contracts\Cache\Store コントラクトを実装する必要があります。したがって、MongoDB のキャッシュ実装は次のようになります:

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

これらのメソッドを実装するには、MongoDB 接続のみが必要です。これらのメソッドの実装方法の例については、フレームワークのソース コードの Illuminate\Cache\MemcachedStore を参照してください。契約が完了したら、以下の手順でカスタムドライバーの登録を完了します。

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

{ヒント} キャッシュ ドライバー コードをどこに配置すればよいかわからない場合は、app ディレクトリに Extensions 名前空間を作成できます。ただし、Laravel はアプリケーションの構造を決定するものではないため、アプリケーションを自由に編成できます。

#ドライバーの登録

Laravel を使用してカスタム キャッシュ ドライバーを登録するには、

キャッシュ ファサードで extend メソッドを使用します。 Cache::extend への呼び出しは、新しい Laravel アプリケーションに付属する App\Providers\AppServiceProviderboot メソッドで行うことも、次の方法でも行うことができます。独自のサービス プロバイダーを作成して拡張機能を保存できますが、config/app.php のプロバイダー配列にサービス プロバイダーを登録することを忘れないでください。

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

は ## に渡されます。 #extend

メソッドの最初のパラメータはドライバーの名前です。これは、config/cache.php 構成ファイルの driver オプションに対応します。 2 番目のパラメーターは、Illuminate\Cache\Repository のインスタンスを返すクロージャです。クロージャには、サービス コンテナの $app インスタンスが渡されます。 拡張機能が登録されたら、

config/cache.php

構成ファイルの driver オプションを拡張機能の名前に更新する必要があります。

イベント

すべてのキャッシュ操作でコードを実行するには、キャッシュによってトリガーされたイベントをリッスンできます。通常、これらのイベント リスナーは

EventServiceProvider

に配置する必要があります。

<?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() {}
    }
この記事は、

LearnKu.com
Web サイトに初めて掲載されました。