Laravel 6.x デプロイ時のキャッシュの扱い
あけましておめでとうございます。ことよろ。
Laravelでハマったので、同じ思いをする人が減ってくれればという思いで書いてみます。
デプロイ後にセッションが消える
cacheとsessionのストアを同一エンドポイントにしたこと、且つ、デプロイ時に php artisan cache:clear
を実行していたこと、の2つが原因でした。
そもそもその辺りの処理をちゃんと理解していなかったので、一から調べ直してみたわけです。
公式は正義
ぐだぐだ言わずにまずは公式ドキュメントを読む。すると、デプロイ時の最適化は以下の3つが重要とのこと。
- オートローダー最適化
- 設定ローディングの最適化
- ルートロードの最適化
オートローダー最適化、はビルド時の話でもあるので置いておき、後者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.php
と packages.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:cache
と route:cache
をまとめるようになっています。Issueにいろいろ経緯があって面白い。
まとめ
念の為、最初に clear-compiled
をやって、view:cache
と optimize
(もしくはconfig:cache
と route:cache
)をやればいいと思います。スッキリですね。
*1:だったらそんなものをartisanコマンドに登録するなよ、と言いたい