【一括クリア】Laravelキャッシュクリア – 基本から応用まで徹底解説

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のキャッシュクリアをするだけでエラーになるような事は一切ありませんでしたが、キャッシュクリアした場合に酷いエラーになる可能性もあります。

その場合にはキャッシュが無くなる事が前提にされていないアプリケーションの実装がされている事になるので、私としては「キャッシュクリアをする場合には注意してね」としか言えません。

この記事で皆さんの力になれれば幸いです。今回もお疲れ様でした。

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA