Search

検索したいワードを入力してください

2019年04月10日

Laravelのキャッシュの使い方からよくあるエラーまで解説

Laravelでは、多くのキャッシュシステムに対応した読み書きしやすいキャッシュ機能が備わっています。Webサイト開発でのページ表示速度の向上には欠かせない「キャッシュ」の使い方をわかりやすくご紹介します。開発の際にはぜひ参考にしてください。

キャッシュとは

キャッシュとは、一度利用したデータなどを一時的に保存することによって、2回目以降のデータ処理速度を速める仕組みです。Laravelでは、キャッシュを上手に利用することでリクエスト処理に対するレスポンスを高速化することが可能です。

しかし、その反面内部キャッシュが残ってて、更新してもブラウザ上で最新の情報が表示されないという現象が起こる場合もあるので、適宜キャッシュは削除する必要もあります。

なお、Laravelでは以下の一文を追加することで、キャッシュはCacheファサードを利用して使うことができます。
use Illuminate\Support\Facades\Cache;

Laravelで扱えるキャッシュドライバーの種類

Laravelでサポートされているキャッシュドライバーの種類は以下の6種類です。この内容は、Laravelのプロジェクトを作成したフォルダの「config\cache.php」内で確認できます。

apc

Alternative PHP Cache (APC) というPHP の実行コードをキャッシュする拡張モジュールを使用します。

array

キャッシュを実装しているコードなどを変更せずに、キャッシュの保存機能を無効にしたい場合に使用します。テスト時に設定されることが多いです。

database

データベースを使ってキャッシュを行います。この場合、あらかじめキャッシュアイテムを構成するテーブルを作成しておく必要があります。
Schema::create('cache', function ($table) {
$table->string('key')->unique();
$table->text('value');
$table->integer('expiration');
});

あるいはArtisanコマンドを使って、適切なスキーマで生成することもできます。
php artisan cache:table

file

ファイルへの書き込みでキャッシュを行います。

デフォルトでは以下のように「file」が設定されていて、「storage\framework\cache\data」配下に書き込まれます。
'default' => env('CACHE_DRIVER', 'file'),
'stores' => [
'file' => [
'driver' => 'file',
'path' => storage_path('framework/cache/data'),
],

memcached

Memcachedという分散メモリ・オブジェクト・キャッシング・システムを使用します。Laravelでmemcachedを使う場合は、Memcached PECLパッケージをインストールする必要があります。

redis

Redisというインメモリデータベースを使用します。Laravelでredisを使う場合は、Composerでpredis/predisパッケージ(~1.0)、もしくはPECLでPhpRedis PHP拡張のどちらかをインストールしておく必要があります。

キャッシュの保存を行いたい場合

キャッシュの保存には、put()メソッドを使います。
Cache::put('key', 'value', $seconds);

有効時間を指定して保存

put()メソッドの引数で保存時間を指定します。なお、Laravel 5.8へのアップグレードで、キャッシュの保存時間は分単位から秒単位に変更となっているので注意が必要です。

Cache::put('key', 'value', 60);と記述した場合、Laravel5.7の場合は60分データが保存され、Laravel5.8の場合は60秒データが保存されます。

有効期限を指定して保存

秒(分)数で指定する代わりに、キャッシュされたデータの有効期限を表すDateTimeインスタンスを渡すこともできます。

(1)10分後まで有効なキャッシュを作成
Cache::put('key', ''value', now()->addMinutes(10));

(2)600秒後まで有効なキャッシュを作成
Cache::put('key', ''value', now()->addSeconds(600));

有効期限がないキャッシュを保存

forever()メソッドを使って、キャッシュを無期限に保存することができます。
Cache::forever('key', 'value');

forever()メソッドを使った場合は有効期限がないので、forget()メソッドで削除する必要があります。また、Memcachedドライバーを使用している場合は、キャッシュが最大値に達するとforeverを指定していても削除されます。

キャッシュがない場合に保存する

すでに'key'という名前のキャッシュがあれば何もせずに、ない場合にのみキャッシュさせたい場合には、add()メソッドを使います。
Cache::add('key', 'value', $seconds);

キャッシュ方式の切り替え

前述のキャッシュ方式を動的に変更したい場合には、store()メソッドを使います。
例1)fileからデータを取得
$value = Cache::store('file')->get('foo');
例2)redisへ10分間データを保存
Cache::store('redis')->put('key', 'value', 600);

キャッシュのデータ型

Laravelで保存できるデータの型には、以下のものがあります。

文字列

文字列とは「文字」のことです。
Cache::forever('key', 'テキスト');

数値

小数点をもたない「整数型」でも、少数以下の数値がある「浮動少数点型」でも保存できます。
Cache::forever('key', 100);
Cache::forever('key', 10.25);

配列型

配列で保存します。
Cache::forever('key', ['りんご', 'みかん', 'バナナ']);

オブジェクト型

連想配列をオブジェクトとして保存します。
Cache::forever('key', [
'apple' => 'りんご',
'orange' => 'みかん',
'banana' => 'バナナ'
]);

なお、配列型とオブジェクト型の場合は、日本語の部分がUnicode エスケープシーケンスされる場合があるので注意が必要です。

インスタンス

Classのインスタンスを生成してキャッシュさせることもできます。
Cache::forever('key', new ClassName());

キャッシュを呼び出したい場合

すでに保存されているキャッシュを呼び出すには、get()メソッドを使います。

基本的な方法

get()メソッドの引数に取得したい識別子(プロパティ)を指定することで、指定したデータを呼び出すことができます。
$value = Cache::get('key');

デフォルト値を指定して取得

有効期限を設定したキャッシュは時間が来ると削除されるため、データが存在しない場合があり、その返り値は「null」となります。そのため、データが存在していない時に返したいデフォルト値をget()メソッドの第二引数で指定することができます。
$value = Cache::get('key', 'default');

関数を使ったデフォルト値を指定して取得

キャッシュデータが存在しなかったときに、データベースから値を取ってこないといけない場合もあります。そういった場合には、デフォルト値として「クロージャ」を渡すことができます。
$value = Cache::get('key', function () {
       return DB::table('テーブル名')->get();
     });

キャッシュが存在するかどうかを知りたい

キャッシュが存在するかどうかを知りたい場合は、has()メソッドを使います。
if (Cache::has('key')) {
//存在した場合の処理をここに記述
}

キャッシュを検索して、なければ新たにデータを保存する

キャッシュが存在すればキャッシュからデータを受け取り、ない場合には新たにデフォルト値を保存したい場合には、remember()メソッドを使います。
$value = Cache::remember('key', $seconds, function () {
return DB::table('テーブル名')->get();  //(例)データベースの検索結果を保存する
});

また、キャッシュを永久に保存したい場合はrememberForever()メソッドを使います。
$value = Cache::rememberForever('key', function () {
return DB::table('テーブル名')->get();
});

値の増減

キャッシュ内の数値を増やしたり減らしたりするには、increment()メソッドとdecrement()メソッドを使います。

値を増やす

例えば表示回数のカウントをする場合など、キャッシュ内の数値を1つずつ増やすには以下のような記述でキャッシュに保存できます。
Cache::increment('key');

また、加算する数値を変える場合には、第二引数に増やす数値を指定します。
Cache::increment('key', 10); //(例)10ずつ増やす場合

値を減らす

逆に、キャッシュ内の数値を1つずつ減らしたい場合は以下のように記述します。
Cache::decrement('key');

減算する数字を変える場合は、加算の場合と同じように第二引数に減らす数値を指定します。
Cache::decrement('key', 10); // (例)10ずつ減らす場合

キャッシュを削除したい場合

キャッシュの削除に関しては、処理内容によって利用するメソッドが変わってきます。

キャッシュの取得後に削除する

キャッシュからデータを取得したあとに、そのキャッシュを削除したい場合はpull()メソッドを使います。
$value = Cache::pull('key');

特定のキャッシュを削除する

特定のキャッシュを削除するには、forget()メソッドでキャッシュ名を指定します。
Cache::forget('key');

全てのキャッシュを削除する

キャッシュ全体をクリアにする場合はflush()メソッドを使います。flush()を使う場合には、他のアプリケーションと共有するキャッシュがないかどうかに注意して使用してください。
Cache::flush();

その他の機能

Laravelにはそのほかにも、負荷を集中させないように一時的にキャッシュをロックしたり、キャッシュを保存する際わかりやすいようにタグづけしたりと、さまざまな機能があります。ただし、Laravelでこれらの機能を利用するには、デフォルトキャッシュドライバの指定があるなどの条件があります。

また、Laravelでは初めからさまざまなキャッシュドライバが用意されていますが、自分自身でカスタムキャッシュドライバを作成して登録することも可能です。

ほかにも、グローバルcache関数を使ったキャッシュヘルパーを利用することもできます。

詳細については、Laravelのドキュメンテーションをご参照ください。

よくあるエラーの原因

Laravelでの開発において、キャッシュ関連でよくみられるエラーにはいくつかの原因があります。

ファイルへの書き込み権限がない場合

次の例は、フォルダまたはファイルへの書き込み権限がないことが原因で起こるエラーです。
file_put_contents(/***/storage/framework/cache/data/*****): failed to open stream: Permission denied

sudo chmod -R 777 storageで解決する

上記の問題を解決するには、以下のコマンドでstorage 以下に書き込み権限をつけます。
sudo chmod -R 777 storage

cacheディレクトリが存在しない

storage\framework\の中の「cache」フォルダを誤って削除してしまった場合には以下のエラーが発生します。
Please provide a valid cache path.

storage\framework\の下層に以下のフォルダ(ファイル)がない場合は作成してください。
storage\framework\cache
storage\framework\cache\.gitignore

本番環境へのデプロイにはキャッシュの削除が必要

ローカル環境から本番環境へデプロイした場合に、キャッシュが残ったままアップされて上手く動かない場合があります。デプロイする前にキャッシュを削除するか、SSHで本番環境のサーバーにログインしてキャッシュを削除するようにしましょう。
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

キャッシュを使うことのメリットを享受しよう

Webサイトへのアクセスが増加するにつれ、データベースへのリクエストも増えてページ表示速度が遅くなることもあります。キャッシュを上手く使うことによって、データベースへの負荷が軽減し、ページ表示の速度も劇的に速くなります。

Laravelではキャッシュ機能が簡単に使えるので、データベースへのリクエストが多かったり、複雑なクエリが多いサイトでは、ぜひキャッシュを利用するようにしましょう。

多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related