Laravelは非常にたくさんのファイルを起動時に読み込んでいるので、パフォーマンスの改善は以前から感心があります。最近、管理画面だけでrouteの数が300近いプログラムをインストールするにあたり、重たくなることを予想して、簡単にできる範囲でLaravelでのパフォーマンスの改善を調査してみました。
1.設定ファイルのキャッシュ作成
php artisan config:cache
この実行は、
ファイルは、
bootstrap/cache/config.php
として作成されます。
この使用において、注意は3点あります。
注意点1:プログラムにおいてenv()
の関数を使用してはいけない
例えば、
.envのファイルにおいて、
APP_ENV=local
と設定していて、
$path = storage_path().'/'.env('APP_ENV').'/logs/test.log';
のように、現在の環境変数の値によりログファイルを置くディレクトリを変えるとすると、
$path
の値は、
/var/www/test/storage/local/logs/test.log
のようになります。
しかし、php artisan config:cache
を実行すると、env()
の値は空となり、
/var/www/test/storage/logs/test.log
となってしまい、意図した場所とは違うことになってしまいます。
それゆえに、先のプログラムは以下と変更することが必要です。
$path = storage_path().'/'.config('app.env').'/logs/test.log';
もちろん、config/app.php
などの設定ファイルの中でのenv()
の使用は問題ないです。
注意点2:ダイナミックに値を設定しているconfigに気をつける
設定ファイルの値は、
config(['some_setting' => 'some_value']);
のようにダイナミックに値の設定が可能です。例えば、DBからの値をAppServiceProvider::boot()
で読み込んでおいて、DBに再度アクセスすることなくプログラムのあちらこちらで使用しようというときなどに便利です。
ところが、php artisan config:cache
の実行時に、AppServiceProvider::boot()
が実行されるので、それらの設定もキャッシュファイルに保存されてしまいます。これで、ダイナミックに変わる値が固定されては困ります。
しかし、ダイナミックに上書きされるので問題はなさそうです。しかし、プログラムの他の部分では問題があるかもしれません。使用には気をつけてください。
注意点3:.envやconfigのファイルを編集したら、必ずキャッシュを再作成
最後に忘れてはならないのは、.env
やconfig/*.php
のファイルを編集したら、必ずphp artisan config:cache
の実行が必要なことです。それなくしては、せっかくの変更も反映されません。
2.routeのキャッシュ作成
php artisan route:cache
こちらは、config:cache
と違い、この実行で作成されるファイル、
bootstrap/cache/routes.php
には、routes.php
ファイルを読み込んでLaravelがマップしたデータ構造をbase64_encode
して、serialize
した形で収めます。それゆえに、この読み込みとマップの作業を一気に短縮します。とくに、routeの数が大きいプロジェクトではパフォーマンスの改善に期待できる仕組みです。
それからconfig:cacheと同様に、routes.phpファイルを編集したら、必ずphp artisan route:cache
の実行が必要です。
3.共有クラスファイルの最適化
これは、環境変数のAPP_ENV
がproductionの値のときにだけに有効なものです。また、設定ファイルに依存するので、設定ファイルをキャッシュするなら、php artisan config:cache
を実行してから以下を実行してください。
php artisan optimize
この実行で、共有されるクラスファイルを1つのファイルにまとめ、読み込み時間を短縮するのが目的です。以下のファイルを作成します。
bootstrap/cache/compiled.php
このファイルには、デフォルトでは、Laravel関連のファイルが含まれますが、必要なら以下の設定ファイルに追加が可能です。
bootstrap/cache/compile.php
改善した?
さて、実際にこれらの最適化でパフォーマンスはどれくらい変わるのでしょうか?
私の厳密ではないテストでは、DB操作を伴わない計測では10~30%の違いがありました。configよりもrouteやoptimizeの方が実際のパフォーマンスにより影響ありました。多分、設定ファイルが小さく数少ないためがその違いと思います。しかし、現実では、DBクエリーやCSS、JS、画像などのダウンロードがはるかに時間がかかるので、まだ私のプロジェクトのスケールではちょっとした改善というところです。スケールがより大きくなるとかなりの差となるかもしれません。
メルマガ購読の申し込みはこちらから。