🙆‍♀️

Laravelのファイルキャッシュの仕組みを理解する

に公開

はじめに

Laravelにはパフォーマンス向上のための、ファイルキャッシュの仕組みがあります。
Webの文献を参照したり、ChatGPTに聞きながら、整理してみました。

ファイルキャッシュとは

Laravelのファイルキャッシュは、特定のファイルをキャッシュすることでレスポンス速度を上げる仕組みです。

ここではまず、Laravelと併用されるBladeテンプレートを例に挙げます。
Bladeテンプレートは、描画をするためにPHPコードにコンパイルする必要があります。
コンパイルには時間がかかりますが、1回目のコンパイル後のファイルをキャッシュすることで、2回目以降の描画ではコンパイルが不要となります。
2回目以降は、下表に示すコンパイル後のファイルがstorage/framework/views/から取得されるため、コンパイル処理がスキップされます。

種類 役割 ファイル名の例 保存場所
コンパイル前(元ファイル) 開発者が書くBladeテンプレート resources/views/welcome.blade.php resources/views/
コンパイル後(生成ファイル) Blade構文をPHPに変換した実行用ファイル storage/framework/views/23a9c17 fbd08b47d82e5dff18b3a9e2b.php storage/framework/views/

それでは、このファイルキャッシュはどのような処理で生成・保存されているのでしょうか?

ファイルキャッシュの生成方法・保存場所

ファイルキャッシュの生成方法は、自動キャッシュと手動キャッシュの2種類があります。

自動キャッシュ

自動キャッシュは、Laravelが自動で実施してくれるキャッシュ処理です。
自動キャッシュの対象となるのは、Bladeテンプレートです。
Bladeテンプレートは、初回のアクセス時にLaravelが自動的にキャッシュファイルを生成します。
そのため、開発者が意識しなくても、2回目以降のアクセスではキャッシュファイルが利用されます。

手動キャッシュ

手動キャッシュは、artisanコマンドを実行して意図的にキャッシュする方法です。
例えば、設定ファイルをキャッシュしたい場合、php artisan config:cacheを実行することで、configディレクトリ配下のファイルをまとめてキャッシュすることができます。

キャッシュファイルの保存場所

キャッシュファイルはディスク(補助記憶装置)に保存されます。
キャッシュ対象になるファイル毎に、それぞれ保存先ディレクトリが異なります。
代表的なキャッシュ対象のファイルと保存先、コマンドを下表にまとめました。

キャッシュ種別 対象ファイル 保存先 生成方法
Bladeビュー resources/views/*.blade.php storage/framework/views/ ・アクセス時に自動キャッシュ
・view:cache コマンド
設定ファイル config/*.php bootstrap/cache/config.php config:cache コマンド
ルート定義 routes/*.php bootstrap/cache/routes-*.php route:cache コマンド

ファイルキャッシュの運用

さて、仕組みが分かった所で、どのような場合にファイルキャッシュを利用すれば良いかを考えてみます。これは、キャッシュのメリットとデメリットを考えると腑に落ちると思います

キャッシュのメリットは処理速度の向上です。設定ファイルやルート定義を何度も読み込む必要がなくなるためです。

一方、キャッシュのデメリットは、ファイルの変更が即座に反映されないことにあります。
開発段階では、ビューや設定ファイル、ルート定義は頻繁に変更されますが、毎回キャッシュを生成してしまうと、変更後に一度キャッシュをクリアする必要があります。
クリアしないと、変更前のキャッシュファイルを読み込んでしまうためです。

そのため、開発環境と本番環境でキャッシュの運用を分けることが一般的です。

開発環境

開発環境では、ファイルの変更をすぐに反映したいので、キャッシュは不要となります。
ただし、Bladeテンプレートに関しては、自動でキャッシュファイルが生成されます。
ビューキャッシュは、Laravelがファイルの更新を検知して、再コンパイルする仕組みがあるため、変更は即座に反映されます。

本番環境

本番環境ではパフォーマンスを優先したいため、デプロイ時にコマンド実行による事前キャッシュを利用することが一般的です。
ユーザはキャッシュ済みのファイルを直接利用できるため、高速な通信が可能になります。

この本番環境のキャッシュ運用において、最も注意しなくてはならない事は、ファイルの更新をしても即座に反映されない点です。

例えば、本番環境で利用する環境変数の値に誤りがあった場合、.envファイルの値を更新しただけでは、反映されません。
これは、Laravelが事前キャッシュした設定ファイルの値を読み込んでしまうためです。
このようなキャッシュの生成忘れによる反映漏れはよくあるケースだと思います。
キャッシュ生成済みのファイルを更新した場合は、キャッシュクリアとキャッシュの再生成を実施する必要があります。

# 設定ファイルの変更を更新したい場合
php artisan config:clear  # キャッシュ削除
php artisan config:cache  # 再生成

ファイルキャッシュによるディスク容量の超過とその対応

最後に、キャッシュ生成により起こりうる問題として、ディスク容量の超過の例を挙げます。

file_put_contents(/path/to/storage/framework/views/abcd1234.php): failed to open stream: No space left on device

上記のエラーは、ディスク容量超過により、ビューキャッシュの書き込みができない状態を示しています。
ビューキャッシュの生成は自動で実行されてしまうため、開発者が気づかぬうちに大量のキャッシュファイルが生成され、ディスクの容量を圧迫してしまうことがあります。

解決策としては、不要なキャッシュファイルを削除することが必要となります。

php artisan view:clear

Discussion