Laravel 開発で何よりも重要なのは キャッシュクリア の方法を知る事です。
ルーティングの変更やテンプレートとconfigやCacheクラスを利用したキャッシュの削除等々、Laravelの実行速度が遅い弱点を克服するためにキャッシュの種類が多く存在します。
本記事では Laravel10系を例に紹介していきます。
この記事を読めばキャッシュの種類や何を実行すべきかがわかるようになります。
「とりあえずすぐ試してみたい!」という方はこちらを参照してください。
目次
キャッシュ系コマンドに共通すること
全体を通してキャッシュクリアについては Artisan Console を使用して実行していきます。 php artisan 〇〇
で実行するあいつです。
キャッシュ系のコマンドに共通するのは
- 〇〇:clear
- 削除
- 〇〇:cache
- (既に作成してあれば)削除してから新しく作る
となっています。物によってはあるものと無い物がありますが、こちらを知っておくと理解も早くなると思います。
全てのキャッシュクリアは optimize:clear
まどろっこしい解説はとりあえず脇に置いて、一発キャッシュクリアする方法として optimize:clear
をする方法です。
$ php artisan optimize:clear
INFO Clearing cached bootstrap files.
events .................................................... 2ms DONE
views ..................................................... 6ms DONE
cache ..................................................... 2ms DONE
route ..................................................... 1ms DONE
config .................................................... 1ms DONE
compiled .................................................. 1ms DONE
$
これでLaravelによるキャッシュクリアが全て実行されます。
実行内容が記述されているファイルはこちらです。
// ファイルパス: vendor/laravel/framework/src/Illuminate/Foundation/Console/OptimizeClearCommand.php
public function handle()
{
$this->components->info('Clearing cached bootstrap files.');
collect([
'events' => fn () => $this->callSilent('event:clear') == 0,
'views' => fn () => $this->callSilent('view:clear') == 0,
'cache' => fn () => $this->callSilent('cache:clear') == 0,
'route' => fn () => $this->callSilent('route:clear') == 0,
'config' => fn () => $this->callSilent('config:clear') == 0,
'compiled' => fn () => $this->callSilent('clear-compiled') == 0,
])->each(fn ($task, $description) => $this->components->task($description, $task));
$this->newLine();
}
Laravelに用意されているキャッシュ系が多岐に渡るため、とりあえず一括で実行できるようにしてくれているのが optimize:clear
になっています。
キャッシュクリア自体は上記のコマンドで完了するのですが、ここからは実行している処理を一つ一つ解説していきます。
イベント機能のキャッシュクリア | event:clear
イベントとリスナーの紐付けキャッシュを削除します。
$ php artisan event:clear
たとえば会員登録機能を作成する際にメール送信する場合にはイベントによるリスナー実行にすることで処理のフックが可能になります。その参照キャッシュを削除する物になります。
公開環境への本番反映などではイベント実行をした際にリスナー全てを参照する事になるためパフォーマンス向上のためにキャッシングを推奨されます。
公式ドキュメント: https://laravel.com/docs/10.x/events#event-discovery-in-production
テンプレートのキャッシュクリア | view:clear
resources/views/*
に存在するviewテンプレートのキャッシュを削除します。
$ php artisan view:clear
デフォルトではレンダリング時に毎回変更が無いかをチェックして無ければ自動で作られます。
viewのキャッシュを作るのは初回のレンダリングによるパフォーマンス低下を無くすためと、デフォルトの設定を変更した場合に必要になります。
公式ドキュメント: https://laravel.com/docs/10.x/views#optimizing-views
Cacheクラスのキャッシング削除 | cache:clear
Cache
クラスを使用したキャッシングを削除します。 Cache::flush();
を実行するのと同じ処理が走ります。
$ php artisan cache:clear
エンジニアが実装するキャッシュ機能はこちらに該当します。
公式ドキュメント: https://laravel.com/docs/10.x/cache#removing-items-from-the-cache
ルーティングキャッシュクリア | route:clear
routes/*
に存在するルーティングに関する記述のキャッシングを削除します。
$ php artisan route:clear
コントローラーを使用せずに routes/*
ファイルに直接処理を書いているとキャッシュ時にエラー表示になるのでご注意ください。
公式ドキュメント: https://laravel.com/docs/10.x/routing#route-caching
コンフィグの更新 | config:clear
config/*
に存在する数十ファイルを1つのファイルにキャッシングしているものを削除します。
$ php artisan config:clear
Laravelの実行コードで言うと
config('app.name')
で呼び出す内容になります。
なお、.env
に関してもアプリケーション内で直接呼び出すのは推奨されておらず、config内で呼び出してから使用することが推奨されているので .env
の内容を変更した場合にも こちらのキャッシュを削除する必要があります。
.env.testing
など、ユニットテスト用の記述についてもキャッシュされてしまうので削除する必要があります。
公式ドキュメント: https://laravel.com/docs/10.x/configuration#configuration-caching
フレームワークで作成したコンパイル削除 | clear-compiled
コンパイルされたクラスとサービスのアプリケーションキャッシュを削除します。
$ php artisan clear-compiled
該当ファイルは以下です
$ ls -1 bootstrap/cache/
packages.php
services.php
$
services.php
がサービスキャッシュで packages.php
がクラスキャッシュです。
アプリケーションが読み込まれると再度キャッシングされます。
レアパターンのキャッシュクリア
Laravelのキャッシュクリアは以上で解決できるかと思います。ですが、それでも解決しない場合にはLaravel以外のキャッシュが関係している可能性もあるのでありえるパターンについても解説していきます。
composer dump-autoload
composerによる読み込みをしているファイルをキャッシュしているものを削除します。
$ composer dump-autoload
詳しくはこちらのページを参照ください
PHPフレームワーク「composer dump-autoload」の重要性について – Qiita
Schedulerのキャッシュ
サーバー起因のエラーによってバッチ実行が出来なくなった場合にSchedulerのキャッシュを削除します。
$ php artisan schedule:clear-cache
INFO No mutex files were found.
$
過去のLaravelでは
storage/framework/schedule-{hashedname}
としてファイルが存在しており、物理削除する必要があったようですが8系以降では schedule:clear-cache
で削除できるようになったみたいです。
参考: https://laracasts.com/discuss/channels/laravel/clear-mutex-cache-entry-for-specific-scheduled-task
参考: https://github.com/laravel/framework/pull/40135
OPcache
OPcacheとはPHPの初回実行の際にコンパイルしたものをキャッシュしておくPHPの機能です。
ファイルの変更があった場合にキャッシュしなおすのですが、デプロイ方法としてシムリンクを使ってデプロイしている場合にはキャッシュ削除の実行をする必要があります。apacheで実行しているアプリケーションであればapacheで削除の実行をします。
詳しくはこちらで取り扱っています
本番ではキャッシュ作成を推奨します
以上で、キャッシュクリアの方法は紹介し終わりました。
ですが、Laravelフレームワークが事前に用意してくれているキャッシュ機能は開発であればclearしたままでも構いませんが、本番環境では話が変わってきます。
何よりも実行速度の問題でキャッシュしないと十分な速度が出ない問題があります。速度が出ない重い処理だからLaravelフレームワークの標準でキャッシュ機能が実装されているので、本番に公開する場合にはキャッシュしていきましょう。
キャッシュし直しをまとめて実行する optimize
が用意されています
$ php artisan optimize
INFO Caching the framework bootstrap files.
config .................................................... 8ms DONE
routes .................................................... 8ms DONE
$
実際の実行コマンドはこちら (configとrouteのキャッシュ作成を行なっています)
public function handle()
{
$this->components->info('Caching the framework bootstrap files');
collect([
'config' => fn () => $this->callSilent('config:cache') == 0,
'routes' => fn () => $this->callSilent('route:cache') == 0,
])->each(fn ($task, $description) => $this->components->task($description, $task));
$this->newLine();
}
他にもPHPプロジェクトのデプロイツールである Deployer の実装も参考になります。 (config、route、view、event のキャッシュ作成をしています)
/**
* Main deploy task.
*/
desc('Deploys your project');
task('deploy', [
'deploy:prepare',
'deploy:vendors',
'artisan:storage:link',
'artisan:config:cache',
'artisan:route:cache',
'artisan:view:cache',
'artisan:event:cache',
'artisan:migrate',
'deploy:publish',
]);
Deployerを使用して本番環境にデプロイすればLaravelプロジェクトのパフォーマンスを最大限発揮するためのcacheの作成をしてくれるようになります。
参照: Laravelのパフォーマンスを最適化する17のコツ
Laravel キャッシュクリア、最後に
以上、Laravelのキャッシュクリアについてまとめていきました。
私の場合ですと開発環境では常に php artisan optimize
をとりあえず打てば解決していました。
ですが、キャッシュクリアについて知りたい人に向けてまとめてみると私自身も知らなかった機能が知れて学びになりました。
何かしらバグが発生した時に疑うのはキャッシュだと思います。
私の経験上ではLaravelのキャッシュクリアをするだけでエラーになるような事は一切ありませんでしたが、キャッシュクリアした場合に酷いエラーになる可能性もあります。
その場合にはキャッシュが無くなる事が前提にされていないアプリケーションの実装がされている事になるので、私としては「キャッシュクリアをする場合には注意してね」としか言えません。
この記事で皆さんの力になれれば幸いです。今回もお疲れ様でした。
コメントを残す