続Laravelにおけるパフォーマンス最適化のための18つのヒント

# 続Laravelにおけるパフォーマンス最適化のための18つのヒント

https://qiita.com/ProjectEuropa/items/e68567f3cd5b0cf31d90

[12 Tips for Laravel Performance Optimization in 2020](https://www.cloudways.com/blog/laravel-performance-optimization/)を大いに参照した、上記のQiita記事を少し更新、改訂しました。
可能な限りLaravelの公式ドキュメントから抽出しています。
Laravelに関係ない一般的な項目も含まれます（~~無理やり18ヒントを捻り出している~~）。

対象となるLaravelのVersionは9.xです。
Laravel Mixに対する記述ありますが、最新はLaravel Viteです(~~Laravel Viteわからないですごめんなさい~~)。

間違い・勘違いなどがある場合は、コメントもしくは編集リクエストをいただけると助かります。


## 目次

1. 構成キャッシング
2. ルートキャッシング
3. 未使用のサービスを削除
4. Composer最適化オートロード
5. クエリ結果のキャッシュ
6. Eager loadingを使用
7. アセットのプリコンパイルと縮小
8. レスポンスキャッシング
9. PHPの最新バージョンを実行
10. CDNを使用
11. データベースインデックスを適切に使用
12. ジョブとキューを活用
13. OPcacheを使用
14. イベントリスナーの最適化
15. プロファイラを使用してパフォーマンス問題を特定
16. セッションストレージの最適化
17. バージョン管理システムから不要なファイルを除外
18. モニタリングとロギングの最適化


### 1. 構成キャッシング

Artisan Cache Configを使用してパフォーマンスを向上させます。

```console
$ php artisan config:cache
```

設定を更新する場合は、キャッシュをクリアしましょう。

```console
$ php artisan config:clear
```

参考リンク: https://laravel.com/docs/9.x/configuration#configuration-caching

### 2. ルートキャッシング

```console
$ php artisan route:cache
```

**configまたはroutesファイルが変更されるたびにコマンドを実行することを忘れないでください。**

キャッシュをクリアするには、次のコマンドを使用します。

```console
$ php artisan route:clear
```

参考リンク: https://laravel.com/docs/9.x/deployment#optimizing-route-loading

### 3. 未使用のサービスを削除

設定ファイルで未使用のサービスを必ず無効にしてください。
使用していないサービスプロバイダーにコメントアウトを追加します。

### 4. Composer最適化オートロード

```console
$ composer dumpautoload -o
```

参考リンク: https://getcomposer.org/doc/03-cli.md#dump-autoload

### 5. クエリ結果のキャッシュ

頻繁に実行されるクエリの結果をキャッシュすることは、Laravelのパフォーマンスを向上させる優れた方法です。

```php
$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を使用します。これにより、アプリケーションのパフォーマンスが向上します。

```php
$books = App\Models\Book::with('author')->get();
```

参考リンク: https://laravel.com/docs/9.x/eloquent-relationships#eager-loading

### 7. アセットのプリコンパイルと縮小

Laravel Mixを使用して、CSSとJavaScriptファイルをプリコンパイルし、縮小することができます。これにより、ファイルサイズが小さくなり、ロード時間が短縮されます。

```console
$ npm run production
```

参考リンク: https://laravel.com/docs/9.x/mix

### 8. レスポンスキャッシング

Laravelは、HTTPレスポンスをキャッシュすることで、さらなるパフォーマンス向上が可能です。キャッシュされたレスポンスは、次回の同じリクエストが高速になります。`spatie/laravel-responsecache`というパッケージを利用して実現できます。

```console
$ 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. モニタリングとロギングの最適化

アプリケーションのパフォーマンスを継続的に監視し、問題が発生した場合に迅速に対処することで、アプリケーションの全体的なパフォーマンスが向上します。また、適切なロギング設定を行い、ログの出力レベルや保存期間を適切に設定することで、パフォーマンスに悪影響を与えるログのオーバーヘッドを削減できます。

参考リンク:
- モニタリング: https://laravel.com/docs/9.x/telescope
- ロギング: https://laravel.com/docs/9.x/logging

### 参考文献一覧

- https://www.cloudways.com/blog
- https://laravel.com/docs/9.x
- https://www.php.net/manual/ja/
- https://github.com/spatie/laravel-responsecache
- https://getcomposer.org/doc/03-cli.md#dump-autoload