Laravel 5.2 キャシュ

設定

Laravelは多くのキャッシュシステムに統一したAPIを提供します。キャッシュの設定はconfig/cache.phpで設定します。アプリケーション全体でデフォルトとして使用するキャッシュドライバをこのファイルの中で指定します。MemcachedRedisなど、人気のあるキャッシュシステムをLaravelは最初からサポートしています。

キャッシュ設定ファイルは様々な他のオプションも含んでいます。コメントで説明してありますのでよく読んで確認してください。Laravelのデフォルトとしてfileキャッシュドライバが設定されています。ファイルシステムにオブジェクトをシリアライズして保存します。大きなアプリケーションでは、MemecachedやAPCのようなメモリに保存するキャッシュを使用することをおすすめします。

キャシュの必要要件

データベース

データベースをキャッシュドライバに使用する場合、キャッシュアイテムを構成するテーブルを用意する必要があります。このテーブルの「スキーマ」を定義するサンプルを見てください。

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ソケットパスにhostオプションを設定することもできます。これを行うにはportオプションに0を指定してください。

'memcached' => [
    [
        'host' => '/var/run/memcached/memcached.sock',
        'port' => 0,
        'weight' => 100
    ],
],

Redis

LaravelでRedisキャシュを使用する場合、predis/predisパッケージ(~1.0)をComposerでインストールしておく必要があります。

Redisの設定についての詳細はLaravelドキュメントページを読んでください。

キャシュの使用法

キャッシュインスタンスの取得

Illuminate\Contracts\Cache\FactoryIlluminate\Contracts\Cache\Repository契約はLaravelのキャッシュサービスへのアクセスを提供します。Factory契約はアプリケーションで定義している全キャッシュドライバへのアクセスを提供します。Repository契約は通常cache設定ファイルで指定されているアプリケーションのデフォルトキャッシュドライバの実装です。

しかしこのドキュメント全体で使用しているCacheファサードも利用できます。Cacheファサードは裏で動作しているLaravelキャッシュ契約の実装への便利で簡潔なアクセスを提供しています。

例としてコントローラーでCacheファサードを使ってみましょう。

<?php

namespace App\Http\Controllers;

use Cache;

class UserController extends Controller
{
    /**
     * アプリケーションの全ユーザリストの表示
     *
     * @return Response
     */
    public function index()
    {
        $value = Cache::get('key');

        //
    }
}

複数のキャッシュ保存先へのアクセス

Cacheファサードのstoreメソッドを使い、様々なキャッシュ保存域へアクセスできます。storeメソッドに渡すキーはcache設定ファイルのstores設定配列にリストしている保存域の一つです。

$value = Cache::store('file')->get('foo');

Cache::store('redis')->put('bar', 'baz', 10);

キャッシュからアイテム取得

Cacheファサードの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')) {
    //
}

値の増減

incrementdecrementメソッドはキャッシュの整数アイテムの値を調整するために使用します。両方のメソッドともそのアイテムの値をどのくらい増減させるかの増分をオプションの第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メソッドに渡された「クロージャ」が実行され、結果がキャッシュに保存されます。

rememberforeverメソッドを一緒に行うこともできます。

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

取得後削除

キャッシュからアイテムを取得した後に削除したい場合は、pullメソッドを使用します。getメソッドと同様にキャッシュにアイテムが存在していない場合は、nullが返ります。

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

キャシュへアイテム保存

Cacheファサードの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();

flushメソッドはキャッシュのプレフィックスを考慮せずに、キャッシュから全アイテムを削除します。他のアプリケーションと共有するキャッシュを削除するときに、利用を考慮してください。

キャシュタグ

注意: filedatabaseキャッシュドライバ使用時、キャッシュタグはサポートされません。また、"forever"を使い、複数のタグをつけたキャッシュを使用する場合、古いレコードを自動的にパージする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');

タグ一つ、もしくはタグのリストに結びついた全アイテムを一度に消去することができます。例えば、次の実行文はpeopleauthorsのどちらか、または両方にタグ付けされたキャッシュを全部削除します。ですから、AnneJohnは両方共キャッシュから削除されます。

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

対照的に、次の実行分ではauthorsにタグ付けしたキャッシュのみ削除されますので、Anneが削除され、Johnは残ります。

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

カスタムキャッシュドライバの追加

Laravelキャッシュをカスタムドライバで拡張するには、マネージャーにカスタムドライバリゾルバ―を結合するために使用するCacheファサードのextendメソッドを使います。通常これはサービスプロバイダの中で行います。

例として"mongo"という名前のキャッシュドライバを登録してみましょう。

<?php

namespace App\Providers;

use Cache;
use App\Extensions\MongoStore;
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()
    {
        //
    }
}

extendメソッドの最初の引数はドライバ名です。これはconfig/cache.php設定ファイルのdriverオプションと対応します。第2引数はIlluminate\Cache\Repositoryインスタンスを返すクロージャです。クロージャにはサービスコンテナインスタンスの$appインスタンスが渡されます。

Cache::extendはインストールしたてのLaravelアプリケーションに含まれているデフォルトのApp\Providers\AppServiceProviderbootメソッドで呼び出すか、もしくは拡張のためにサービスプロバイダを新たに作成することもできるでしょう。この場合はサービスプロバイダをconfig/app.phpのproviders配列へ登録するのを忘れないでください。

カスタムキャッシュドライバを作成するには、最初にIlluminate\Contracts\Cache\Store 契約を実装する必要があります。ですからMongoDBキャシュの実装は次のような感じになるでしょう。

<?php

namespace 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の中へ設置します。

/**
 * アプリケーションのイベントリスナ
 *
 * @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',
    ],
];

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる