続Laravelにおけるパフォーマンス最適化のための18つのヒント
12 Tips for Laravel Performance Optimization in 2020を大いに参照した、上記のQiita記事を少し更新、改訂しました。
可能な限りLaravelの公式ドキュメントから抽出しています。
Laravelに関係ない一般的な項目も含まれます(無理やり18ヒントを捻り出している)。
対象となるLaravelのVersionは9.xです。
Laravel Mixに対する記述ありますが、最新はLaravel Viteです(Laravel Viteわからないですごめんなさい)。
間違い・勘違いなどがある場合は、コメントもしくは編集リクエストをいただけると助かります。
目次
- 構成キャッシング
- ルートキャッシング
- 未使用のサービスを削除
- Composer最適化オートロード
- クエリ結果のキャッシュ
- Eager loadingを使用
- アセットのプリコンパイルと縮小
- レスポンスキャッシング
- PHPの最新バージョンを実行
- CDNを使用
- データベースインデックスを適切に使用
- ジョブとキューを活用
- OPcacheを使用
- イベントリスナーの最適化
- プロファイラを使用してパフォーマンス問題を特定
- セッションストレージの最適化
- バージョン管理システムから不要なファイルを除外
- モニタリングとロギングの最適化
1. 構成キャッシング
Artisan Cache Configを使用してパフォーマンスを向上させます。
$ php artisan config:cache
設定を更新する場合は、キャッシュをクリアしましょう。
$ php artisan config:clear
参考リンク: https://laravel.com/docs/9.x/configuration#configuration-caching
2. ルートキャッシング
$ php artisan route:cache
configまたはroutesファイルが変更されるたびにコマンドを実行することを忘れないでください。
キャッシュをクリアするには、次のコマンドを使用します。
$ php artisan route:clear
参考リンク: https://laravel.com/docs/9.x/deployment#optimizing-route-loading
3. 未使用のサービスを削除
設定ファイルで未使用のサービスを必ず無効にしてください。
使用していないサービスプロバイダーにコメントアウトを追加します。
4. Composer最適化オートロード
$ composer dumpautoload -o
参考リンク: https://getcomposer.org/doc/03-cli.md#dump-autoload
5. クエリ結果のキャッシュ
頻繁に実行されるクエリの結果をキャッシュすることは、Laravelのパフォーマンスを向上させる優れた方法です。
$posts = Cache::remember('index.posts', 30, function(){
return Post::with('comments', 'tags', 'author', 'seo')->whereHidden(0)->get();
});
参考リンク: https://laravel.com/docs/9.x/cache#cache-usage
6. Eager loadingを使用する
Eloquentは最初のクエリに応答してEloquentは最初のクエリに応答して関連データをロードするために追加のクエリを実行することを避けるために、Eager loadingを使用します。これにより、アプリケーションのパフォーマンスが向上します。
$books = App\Models\Book::with('author')->get();
参考リンク: https://laravel.com/docs/9.x/eloquent-relationships#eager-loading
7. アセットのプリコンパイルと縮小
Laravel Mixを使用して、CSSとJavaScriptファイルをプリコンパイルし、縮小することができます。これにより、ファイルサイズが小さくなり、ロード時間が短縮されます。
$ npm run production
参考リンク: https://laravel.com/docs/9.x/mix
8. レスポンスキャッシング
Laravelは、HTTPレスポンスをキャッシュすることで、さらなるパフォーマンス向上が可能です。キャッシュされたレスポンスは、次回の同じリクエストが高速になります。spatie/laravel-responsecache
というパッケージを利用して実現できます。
$ composer require spatie/laravel-responsecache
参考リンク: https://github.com/spatie/laravel-responsecache
9. PHPの最新バージョンを実行する
Laravelアプリケーションのパフォーマンスを向上させるために、最新のPHPバージョンを使用してください。PHP 8.0以降のバージョンは、パフォーマンス向上機能が追加されています。
10. CDNを使用する
CDN(Content Delivery Network)を使用することで、静的アセットの配信速度を向上させることができます。これにより、ユーザーに対して高速なページロードを提供できます。
11. データベースインデックスを適切に使用する
データベースのクエリパフォーマンスを向上させるために、適切なインデックスを使用してください。インデックスを適切に使用することで、データベース検索の速度が向上し、アプリケーション全体のパフォーマンスが向上します。
参考リンク: https://laravel.com/docs/9.x/migrations#creating-indexes
12. ジョブとキューを活用する
非同期処理によってアプリケーションのパフォーマンスを向上させることができます。Laravelのジョブとキュー機能を使用して、時間がかかるタスクをバックグラウンドで実行し、ユーザーへの応答時間を短縮します。
参考リンク: https://laravel.com/docs/9.x/queues
13. OPcacheを使用する
OPcacheを使用することで、PHPコードの実行速度が向上します。PHPのOPcacheを有効にすることで、毎回スクリプトをコンパイルする必要がなくなり、アプリケーションのパフォーマンスが向上します。
参考リンク: https://www.php.net/manual/ja/opcache.installation.php
14. イベントリスナーの最適化
イベントリスナーはアプリケーションのパフォーマンスに影響を与えることがあります。イベントリスナーを最適化することで、アプリケーションのパフォーマンスが向上します。イベントリスナーの数を最小限に抑え、必要なものだけを登録するようにしてください。
参考リンク: https://laravel.com/docs/9.x/events
15. プロファイラを使用してパフォーマンス問題を特定する
Laravelのパフォーマンス問題を特定するために、プロファイラツールを使用してください。プロファイラは、アプリケーションの実行時間やメモリ使用量を解析し、パフォーマンスボトルネックを特定するのに役立ちます。Laravel DebugbarやClockworkなどのプロファイラツールを利用できます。
参考リンク:
- Laravel Debugbar: https://github.com/barryvdh/laravel-debugbar
- Clockwork: https://github.com/itsgoingd/clockwork
16. セッションストレージの最適化
セッションストレージには、ファイル、データベース、Redisなどが選択できますが、適切なストレージドライバーを選択することでパフォーマンスが向上します。たとえば、高トラフィックのアプリケーションでは、Redisをセッションストレージとして使用すると、パフォーマンスが向上することがあります。
参考リンク: https://laravel.com/docs/9.x/session#configuration
17. バージョン管理システムから不要なファイルを除外する
バージョン管理システム(例えば、Git)から不要なファイル(キャッシュファイル、ログファイル、コンパイル済みアセットなど)を除外することで、デプロイ時のファイル転送量を削減し、アプリケーションのパフォーマンスが向上します。.gitignore
ファイルを適切に設定し、不要なファイルをリポジトリに含めないようにしてください。
参考リンク: https://github.com/github/gitignore/blob/master/Laravel.gitignore
18. モニタリングとロギングの最適化
アプリケーションのパフォーマンスを継続的に監視し、問題が発生した場合に迅速に対処することで、アプリケーションの全体的なパフォーマンスが向上します。また、適切なロギング設定を行い、ログの出力レベルや保存期間を適切に設定することで、パフォーマンスに悪影響を与えるログのオーバーヘッドを削減できます。
参考リンク: