Laravel は、さまざまなキャッシュ システムに統合された API を提供します。キャッシュ設定は config/cache.php にあります。このファイルでは、アプリケーションでデフォルトで使用するキャッシュ ドライバーを指定できます。 Laravel は現在、Memcached や Redis などの主流のキャッシュ バックエンドをサポートしています。
キャッシュ設定ファイルには他の文書化されたオプションも含まれています。必ずこれらを注意深く読んでください。デフォルトでは、Laravel はファイル キャッシュを使用するように設定されており、シリアル化されたデータとキャッシュされたオブジェクトをファイル システムに保存します。大規模なアプリケーションの場合は、Memcached や APC などのメモリ内キャッシュを使用することをお勧めします。同じドライバーに対して複数のキャッシュ構成を構成することもできます。
データベース
データベース キャッシュ ドライバーを使用する場合、キャッシュ キャッシュ項目を含むテーブルを設定する必要があります。以下はテーブルのスキーマ宣言です:
Schema::create('cache', function($table) { $table->string('key')->unique(); $table->text('value'); $table->integer('expiration');});
Memcached
Memcached キャッシュを使用するには、PHP Memcached 拡張機能である Memcached PECL パッケージのインストールが必要です。
Memcached::addServer のデフォルト設定では TCP/IP プロトコルが使用されます:
'memcached' => [ [ 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100 ],],
ホスト オプションを UNIX ソケット パスに設定することもできます:
'memcached' => [ [ 'host' => '/var/run/memcached/memcached.sock', 'port' => 0, 'weight' => 100 ],],
これを行う場合は、ポート オプションを 0 に設定する必要があります。 Redis
Laravel の Redis を使用する キャッシュする前に、Composer を通じて predis/predis パッケージ (~1.0) をインストールする必要があります。
Redis 構成の詳細については、Larave の Redis ドキュメントを参照してください。
IlluminateContractsCacheFactory コントラクトと IlluminateContractsCacheRepository コントラクトは、Laravel のキャッシュ サービスにアクセスするメソッドを提供します。 Factory コントラクトは、アプリケーション定義のキャッシュ ドライバーにアクセスするためのすべてのメソッドを提供します。通常、リポジトリ コントラクトは、アプリケーションのキャッシュ構成ファイルで指定されたデフォルトのキャッシュ ドライバーの実装です。
ただし、キャッシュ ファサードを使用することもできます。キャッシュ ファサードは、基礎となる Laravel キャッシュ コントラクト実装への簡単で便利なアクセスを提供します。
たとえば、コントローラーにキャッシュ ファサードをインポートしてみましょう:
<?phpnamespace App\Http\Controllers;use Cache;use Illuminate\Routing\Controller;class UserController extends Controller{ /** * 显示应用所有用户列表 * * @return Response */ public function index() { $value = Cache::get('key'); // }}
複数のキャッシュ ストアにアクセスする
キャッシュ ファサードを使用すると、store メソッドを使用してさまざまなキャッシュ ストアにアクセスできます。キャッシュ構成ファイル ストア構成配列にリストされている対応するストレージ:
$value = Cache::store('file')->get('foo');Cache::store('redis')->put('bar', 'baz', 10);
キャッシュ項目が存在しない場合は、キャッシュ ファサードの get メソッドを使用してキャッシュ項目を取得します。 、nullが返されます。必要に応じて、get メソッドに 2 番目のパラメータを渡して、キャッシュ項目が存在しないときに返されるカスタムのデフォルト値を指定できます:
$value = Cache::get('key');$value = Cache::get('key', 'default');
デフォルト値としてクロージャを渡したり、クロージャの結果を渡すこともできます。キャッシュ項目が存在しない場合は返されます。推移的閉包を使用すると、データベースまたは他の外部サービスからデフォルト値を取得できます:
$value = Cache::get('key', function() { return DB::table(...)->get();});
キャッシュ項目が存在するかどうかを確認します
has メソッドを使用して、キャッシュ項目が存在するかどうかを判断します:
if (Cache::has('key')) { //}
値の増加/減少
インクリメントメソッドとデクリメントメソッドが利用可能です。キャッシュ内の整数値を調整するために使用されます。どちらのメソッドも、キャッシュ項目値の増分および減分数を指定する 2 番目のパラメーターを受け取ることができます:
Cache::increment('key');Cache::increment('key', $amount);Cache::decrement('key');Cache::decrement('key', $amount);
取得または更新
キャッシュ項目を取得したい場合がありますが、要求されたキャッシュ項目が存在しない場合は、それを渡します。デフォルト値が格納されます。たとえば、キャッシュからすべてのユーザーを取得するか、ユーザーが存在しない場合は、Cache::remember メソッドを使用してこれを実行できます:
$value = Cache::remember('users', $minutes, function() { return DB::table('users')->get();});
キャッシュ項目が存在しない場合 存在する場合、remember メソッドに渡されたクロージャが実行され、結果がキャッシュに格納されます。
remember メソッドとforever メソッドを組み合わせることもできます:
rrreeGet および delete
キャッシュからキャッシュ項目を取得して削除する必要がある場合は、get メソッドと同じ pull メソッドを使用できます。メソッドを呼び出し、キャッシュ項目が存在しない場合は null を返します。 :
$value = Cache::rememberForever('users', function() { return DB::table('users')->get();});
キャッシュ ファサードで put メソッドを使用して、キャッシュ項目をキャッシュに保存できます。キャッシュ アイテムをキャッシュに保存するときは、データをキャッシュする期間 (分単位) を指定する必要があります:
$value = Cache::pull('key');
キャッシュ アイテムの有効期限を渡すことに加えて、キャッシュ アイテムの有効期限を表す PHP Datetime インスタンスも渡すことができます。キャッシュ項目の有効期間:
Cache::put('key', 'value', $minutes);
add メソッドは、キャッシュ項目がキャッシュに追加される場合にのみキャッシュ項目をキャッシュに追加します。それ以外の場合は false を返します:
$expiresAt = Carbon::now()->addMinutes(10);Cache::put('key', 'value', $expiresAt);
。キャッシュ項目をキャッシュに永続的に保存するには、forever メソッドを使用します。これらの値は、forget メソッドを使用してキャッシュから手動で削除する必要があります。ファサードを使用して、キャッシュからキャッシュ項目を削除します:
Cache::add('key', 'value', $minutes);
Cache::forever('key', 'value');
キャッシュ キー プレフィックスに関係なくキャッシュをクリアしますが、キャッシュ システムからすべてのデータを削除するため、このメソッドを使用する場合は、他のアプリケーションがこのアプリケーションとキャッシュを共有している場合は、特に注意する必要があります。
注意:缓存标签目前不支持 file或 database缓存驱动,此外,当使用多标签的缓存被设置为永久存储时,使用 memcached驱动的缓存有着最佳性能表现,因为 Memcached 会自动清除陈旧记录。
缓存标签允许你给相关缓存项打上同一个标签以便于后续清除这些缓存值,被打上标签的缓存可以通过传递一个被排序的标签数组来访问。例如,我们可以通过以下方式在添加缓存的时候设置标签:
Cache::tags(['people', 'artists'])->put('John', $john, $minutes);Cache::tags(['people', 'authors'])->put('Anne', $anne, $minutes);
你可以给多个缓存项打上相同标签,这是没有数目限制的。
要获取被打上标签的缓存项,传递同样的有序标签数组到 tags方法:
$john = Cache::tags(['people', 'artists'])->get('John');$anne = Cache::tags(['people', 'authors'])->get('Anne');
你可以同时清除被打上同一标签/标签列表的所有缓存项,例如,以下语句会移除被打上 people或 authors标签的所有缓存:
Cache::tags(['people', 'authors'])->flush();
这样,上面设置的 Anne和 John缓存项都会从缓存中移除。
相反,以下语句只移除被打上 authors标签的语句,所以只有 Anne会被移除而 John不会:
Cache::tags('authors')->flush();
要使用自定义驱动扩展 Laravel 缓存,可以使用 Cache门面提供的 extend方法,该方法用于绑定定义驱动解析器到管理器,通常,这可以在服务提供者中完成。
例如,要注册一个新的命名为“mongo”的缓存驱动:
<?phpnamespace App\Providers;use Cache;use App\Extensions\MongoStore;use Illuminate\Support\ServiceProvider;class CacheServiceProvider extends ServiceProvider{ /** * Perform post-registration booting of services. * * @return void */ public function boot() { Cache::extend('mongo', function($app) { return Cache::repository(new MongoStore); }); } /** * Register bindings in the container. * * @return void */ public function register() { // }}
传递给 extend方法的第一个参数是驱动名称。该值对应配置文件 config/cache.php中的 driver选项。第二个参数是返回 Illuminate\Cache\Repository实例的闭包。该闭包中被传入一个 $app实例,也就是服务容器的一个实例。
调用 Cache::extend可以在默认 App\Providers\AppServiceProvider中的 boot方法中完成,或者你也可以创建自己的服务提供者来存放该扩展——只是不要忘了在配置文件 config/app.php中注册该提供者。
要创建自定义的缓存驱动,首先需要实现 Illuminate\Contracts\Cache\Store契约,所以,我们的 MongoDB缓存实现看起来像这样子:
<?phpnamespace App\Extensions;class MongoStore implements \Illuminate\Contracts\Cache\Store{ public function get($key) {} public function put($key, $value, $minutes) {} 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连接实现每一个方法,实现完成后,我们可以完成自定义驱动注册:
Cache::extend('mongo', function($app) { return Cache::repository(new MongoStore);});
扩展完成后,只需要更新配置文件 config/cache.php的 driver选项为你的扩展名称。
如果你在担心将自定义缓存驱动代码放到哪,考虑将其放到Packgist!或者,你可以在 app目录下创建一个 Extensions命名空间。然而,记住 Laravel 并没有一个严格的应用目录结构,你可以基于你的需要自由的组织目录结构。
要在每次缓存操作时执行代码,你可以监听缓存触发的事件,通常,你可以将这些缓存处理器代码放到 EventServiceProvider中:
/** * The event listener mappings for the application. * * @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', ],];