Laravel 6.x デプロイ時のキャッシュの扱い

あけましておめでとうございます。ことよろ。

Laravelでハマったので、同じ思いをする人が減ってくれればという思いで書いてみます。

デプロイ後にセッションが消える

cacheとsessionのストアを同一エンドポイントにしたこと、且つ、デプロイ時に php artisan cache:clear を実行していたこと、の2つが原因でした。

そもそもその辺りの処理をちゃんと理解していなかったので、一から調べ直してみたわけです。

公式は正義

ぐだぐだ言わずにまずは公式ドキュメントを読む。すると、デプロイ時の最適化は以下の3つが重要とのこと。

  • オートローダー最適化
  • 設定ローディングの最適化
  • ルートロードの最適化

readouble.com

オートローダー最適化、はビルド時の話でもあるので置いておき、後者2つに関連してartisanコマンドのソースを追ってみる。

ディレクトリは大体↓の辺り。

framework/src/Illuminate/Foundation/Console at 6.x · laravel/framework · GitHub

php artisan view:cache

view:clear してからキャッシュを生成しているらしい。

php artisan route:cache

こいつも同じ、route:clear してからキャッシュ生成。

php artisan config:cache

言わずもがな、config:clear してから生成。

php artisan clear-compiled

services.phppackages.php をクリアする、bootstrap/cache/ 配下に生成されるコンパイルファイルですね。

この2つのファイルは Illuminate\Foundation\Console\Kernel.php$bootstrappers -> \Illuminate\Foundation\Bootstrap\RegisterProviders で作成されるので、コマンドを叩けば毎回処理が走るもよう。

php artisan optimize:clear

view:clear cache:clear route:clear config:clear clear-compiled のオールインワンコマンド。

php artisan cache:clear

厄介なコマンドその1、というか罠。

↑の optimize:clear にしれっと紛れ込んでいますが、内部で flush が走っているので安易に使うと死にます。

flushメソッドは、キャッシュのプレフィックスを考慮せずに、キャッシュから全アイテムを削除します。他のアプリケーションと共有するキャッシュを削除するときは、利用を熟考してください。 キャッシュ 6.x Laravel *1

php artisan optimize

厄介なコマンドその2、Webで調べていると混乱するやつ。

元々、5.4までは「クラスローダーの最適化」と「コンパイルファイルのクリア」という役割を持っていましたが、deprecatedになって5.5で消されました。その後、5.7から機能も新たに config:cacheroute:cache をまとめるようになっています。Issueにいろいろ経緯があって面白い。

まとめ

念の為、最初に clear-compiled をやって、view:cacheoptimize(もしくはconfig:cacheroute:cache)をやればいいと思います。スッキリですね。

*1:だったらそんなものをartisanコマンドに登録するなよ、と言いたい