ホームページ >バックエンド開発 >PHPチュートリアル >laravelの基本チュートリアル -- キャッシュ
Laravel は、複数のキャッシュ システムに統合された API を提供します。キャッシュされた設定ファイルは config/cache.php に保存されます。このファイルでは、アプリケーション全体でデフォルトで使用されるキャッシュ ドライバーを指定できます。 Laravel は、Memcached や Redis などの現在の主流のキャッシュ システムをサポートしています。
キャッシュされた構成ファイルには、いくつかの追加の構成オプションも含まれています。これらのオプションのコメントを必ず読んでください。デフォルトでは、Laravel はファイルシステムにシリアル化されたキャッシュオブジェクトを保存するファイルキャッシュドライバーを使用するように構成されています。大規模なアプリケーションの場合は、Memcached や APC などのメモリ レベルのキャッシュを使用することをお勧めします。 laravel で複数のキャッシュ構成を同じドライバーに構成することもできます。
データベース
データベース キャッシュ ドライバーを使用する場合、これらのキャッシュ エントリを含むテーブルを作成する必要があります。次のスキーマ定義に従ってテーブル ファイルを作成できます:
Schema::create('cache', function ($table) { $table->string('key')->unique(); $table->text('value'); $table->integer('expiration'); });
また、php Artisan Cache:table Artisan コマンドを使用して、正しいキャッシュ テーブル構造の移行を生成することもできます。
Memcached
Memcached キャッシュを使用するには、Memcached PECL パッケージをインストールする必要があります。
デフォルトの構成は、TCP/IP を使用した Memcached::addServer に基づいています。
'memcached' => [ [ 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100 ]],
UNIX ソケット パスを使用してホストを設定することもできます。これを行う場合は、ポートを 0 に設定する必要があります:
'memcached' => [ [ 'host' => '/var/run/memcached/memcached.sock', 'port' => 0, 'weight' => 100 ],],
Redis
Redis キャッシュを使用する前に、Composer を通じて predis/predis をインストールする必要があります。 Redis の構成情報の詳細については、Laravel ドキュメント ページを参照してください。
IlluminateContractsCacheFactory コントラクトと IlluminateContractsCacheRepository コントラクトは、Laravel キャッシュ サービスへのアクセスを提供します。 Factory コントラクトは、アプリケーション内のすべてのキャッシュ ドライバーの定義を提供します。通常、リポジトリ コントラクトは、キャッシュ構成ファイルで使用されるデフォルトのキャッシュ ドライバーに基づく実装です。
実際、このドキュメントでは例としてキャッシュ マスクを使用することもできます。キャッシュマスクは、Laravel の基礎となるキャッシュコントラクト実装にアクセスするための便利で簡潔な方法を提供します。
たとえば、コントローラーにキャッシュ マスクを導入してみましょう。
<?phpnamespace App\Http\Controllers;use Cache;class UserController extends Controller { /** * Show a list of all users of the application. * * @return Response */ public function index() { $value = Cache::get('key'); // }}
複数のキャッシュ ストアにアクセスします。
キャッシュを通じてさまざまなキャッシュ ストアにアクセスできます。さまざまなキャッシュ ストアにアクセスするためのマスク ストア メソッド。ストア メソッドに渡されるキーは、キャッシュ構成ファイル内のストア構成アイテムのリストの 1 つと一致する必要があります:
$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');
デフォルト値として Closure を渡すこともできます。キャッシュされた項目が存在しない場合は、Closure によって返された値がデフォルト値として使用されます。クロージャーを渡すと、データベースまたは他の外部サービスからデフォルト値を遅延取得できます。
$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(); });
項目がキャッシュから取得されない場合、rememberer メソッドに渡されたクロージャが実行され、その実行結果は Replace in になります。キャッシュ。
記憶メソッドと永遠メソッドを組み合わせることもできます。
$value = Cache::rememberForever('users', function () { return DB::table('users')->get(); });
取得と削除
アイテムを取得して取得する必要がある場合同時にキャッシュから項目を削除するには、プル メソッドを使用できます。 get メソッドと同様に、項目が取得されない場合は null が返されます。
$value = Cache::pull('key');
キャッシュ マスクの put メソッドを使用して、キャッシュ内のアイテム キャッシュ内。項目をキャッシュに保存するときは、その項目をキャッシュする必要がある値を分単位で指定する必要があります。
Cache::put('key', 'value', $minutes);
キャッシュの有効期限が切れるまでの分単位の数値を渡すことに加えて、 PHP DateTime インスタンスを渡してキャッシュの有効期限を設定することもできます:
$expiresAt = Carbon::now()->addMinutes(10);Cache::put('key', 'value', $expiresAt);
add メソッドは、対応する項目がキャッシュに存在しない場合にのみ項目をキャッシュに追加します。このメソッドは、項目がキャッシュに追加された後、true を返します。それ以外の場合は false を返します:
Cache::add('key', 'value', $minutes);
forever 方法可以用来将项目永久的添加进缓存。该值只有手动的使用 forget 方法才能被移除:
Cache::forever('key', 'value');
你可以使用 Cache 假面的 forget 方法来从缓存中移除某项:
Cache::forget('key');
你可以使用 flush 方法来擦除所有的缓存:
Cache::flush();
擦除缓存并不会根据前缀来进行智能擦除,它会移除所有的缓存。所以如果你的应用和其他的应用共享缓存,你应该谨慎的使用该方法。
注意: 缓存标签并不支持 file 或者 database 缓存驱动。另外,对于将多种标签标记为永久存储的驱动,性能最好的是能够提供自动清除过期记录的驱动,比如 memcached。
缓存标签允许你将相关的项目进行关联标记。并且允许一次性清除所有给定标签的缓存项。你可以通过有序的标签数组来访问被标记的缓存项目。比如,让我们访问被标记的项目并使用 put 方法来设置缓存值:
Cache::tags(['people', 'artists'])->put('John', $john, $minutes);Cache::tags(['people', 'authors'])->put('Anne', $anne, $minutes);
事实上,你并没有被限制只使用 put 方法。你可以在标签中使用任意的缓存存储方法。
为了访问被标记了的缓存项,你需要传递相应的有序列表到 tags 方法:
$john = Cache::tags(['people', 'artists'])->get('John');$anne = Cache::tags(['people', 'authors'])->get('Anne');
你可以一次性的擦除分配的标记或者标记列表中的所有项。比如,你可以使用 flush 方法来删除所有的 people 和 authors 标签和两者组成的有序列标签里的所有缓存项。所以,Anne 和 John 都会被从缓存中移除:
Cache::tags(['people', 'authors'])->flush();
下面的语句将会作为上面语句的对照,将只会从缓存中删除 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 实例,这个实例是 laravel 中的服务容器的实例。
Cache::extend 方法的调用应该在 App\Providers\AppServiceProvider 的 boot 方法中完成。或者你可以创建自己的服务提供者来存储这个扩展。但是不要忘记在 config/app.php 文件中进行注册。
为了创建我们自己的缓存驱动,我们首先需要实现 Illuminate\Constracts\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 为你的扩展的名称。
如果你在为自定义的缓存文件应该存放在哪里而疑惑,你可以考虑将其发布到 Packagist!或者,你可以在 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', ], ];