Laravel 5.1 キャシュ

設定

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');
});

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;
use Illuminate\Routing\Controller;

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

You may clear the entire cache using the flush method:

Cache::flush();

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は厳格なアプリケーション構造を持たないため、自分の好みに応じてアプリケーションを系統立てられることを忘れないでください。

キャッシュタグ

注意: キャッシュタグは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();

キャッシュイベント

キャッシュ操作が起きるごとにコードを実行するには、キャッシュにより発行されるイベントをリッスンしてください。通常、EventServiceProviderbootメソッドの中にイベントハンドラーを設置することになるでしょう。

/**
 * アプリケーションのその他のイベントの登録
 *
 * @param  \Illuminate\Contracts\Events\Dispatcher  $events
 * @return void
 */
public function boot(DispatcherContract $events)
{
    parent::boot($events);

    $events->listen('cache.hit', function ($key, $value) {
        //
    });

    $events->listen('cache.missed', function ($key) {
        //
    });

    $events->listen('cache.write', function ($key, $value, $minutes) {
        //
    });

    $events->listen('cache.delete', function ($key) {
        //
    });
}

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュを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)へ移動

その他

?

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