2020年のLaravelパフォーマンス最適化のための12のヒント

更新版の記事を載せます。
https://qiita.com/ProjectEuropa/items/2f3b3fdbae8831e5fe7f

# 概要

[12 Tips for Laravel Performance Optimization in 2020](https://www.cloudways.com/blog/laravel-performance-optimization/)
から引っ張ってきたものです。~~結構Google翻訳の質が向上していた。~~

掻い摘んで抜粋していきます。

## 目次

1. 構成キャッシング
2. ルートキャッシング
3. 未使用のサービスを削除
4. クラスマップの最適化
5. Composer最適化オートロード
6. 含まれるライブラリを制限する
7. JITコンパイラ
8. Fast Cache and Sessionドライバーを選択する
9. クエリ結果のキャッシュ
10. Eager loadingを使用する
11. アセットのプリコンパイル
12. PHPの最新バージョンを実行する
13. CDNを使う
14. アセットバンドル
14. ファイル圧縮
15. PHPの最新バージョンを実行する
16. Laravelデバッグバー
17. Laravelの一般的なパフォーマンスチューニングのヒント

~~12のヒントという割には結構項目が多い...~~

## 前提条件

- Laravel 5.5
- PHP 7.1
- MySQL (Version不明)

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

Artisan Cache Configでパフォーマンスを向上させます。

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

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

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

アプリケーションをさらに最適化するには、PHPコードをキャッシュするOPcacheを使用して、再コンパイルする必要がないようにします。
[OPcache PHP公式ドキュメント](https://www.php.net/manual/ja/book.opcache.php)

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

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

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

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

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

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

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

### 4. クラスマップの最適化

```console
$ php artisan optimize --force
```

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

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

### 6. 含まれるライブラリを制限する

ライブラリなしで実行できると思われる場合は、 `config/app.php`から削除してLaravelアプリを高速化します。もう1つの重要な場所は`composer.json`です。

### 7. JITコンパイラ

Laravelアプリの場合、推奨されるJITコンパイラはFacebookのHHVMです。

@ytake さんからの指摘です。
> HHVM4.0以降はPHPの動作をサポートしていませんので、
現時点でHHVM上でLaravelを動かすのはお勧めしません。(PHPのコードはもう動きません)
現在の最新バージョンはPHP互換環境ではなくなっていますよ。

### 8. Fast Cache and Sessionドライバーを選択する

Laravel5のパフォーマンスのための最速のキャッシュおよびセッションドライバーはMemcachedだと思われます。

セッションドライバーを変更するためのドライバーキーは、通常 `app/config/session.php` にあります。同様に、キャッシュドライバーを変更するためのドライバーキーは `app/config/cache.php` にあります。

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

頻繁に実行されるクエリの結果をキャッシュすることは、Laravel5.5のパフォーマンスを向上させる優れた方法です。
次のように使用される記憶機能をお勧めします。

```php
$posts = Cache::remember('index.posts', 30, function(){
    return Post::with('comments', 'tags', 'author', 'seo')->whereHidden(0)->get();
});
```

### 10. Eager loadingを使用する

Eloquentは最初のクエリに応答して、関連付けられているすべてのオブジェクトモデルを取得します。これにより、アプリケーションの応答が増加します。

遅延ローディングの例です。

```php
$books = App\Book::all();
foreach ($books as $book) {
    echo $book->author->name;
}
```

Eager loadingの例です。

```php
$books = App\Book::with('author')->get();
foreach ($books as $book) {
    echo $book->author->name;
}
```

### 11. アセットのプリコンパイル

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

### 12. CDNを使う

CDNサーバーから静的アセットファイルをロードすると（ファイルをホストするサーバーから直接ロードするのではなく）、Laravelアプリケーションのパフォーマンスが向上します。

### 13. アセットバンドル

Laravel Mixで複数のスタイルシートやJSファイルを1つのファイルに効率的に連結できます。

```webpack.mix.js
mix.styles([
'public/css/vendor/normalize.css',
'public/css/styles.css'
], 'public/css/all.css');
```

### 14. ファイル圧縮

Laravel Mixを使用してアセットを縮小できます。

```console
$ npm run production
```

### 15. PHPの最新バージョンを実行する

PHPの最新バージョンでは、パフォーマンスが大幅に向上しています。したがって、Laravelアプリケーションが最新バージョンのPHPを実行していることを確認して、アプリケーションの新しいバージョンで導入されたすべてのパフォーマンス改善を活用できるようにします。

### 16. Laravelデバッグバー

最適化手法ではなく、パッケージです。Laravel Debugbarは、PHPデバッグバーをLaravel 5と統合するためのパッケージです。

ServiceBarには、デバッグバーを登録して出力に添付するServiceProviderが含まれています。

Laravelパフォーマンスモニターとして使用できるパッケージです。アプリケーションの開発中にこのパッケージを使用することをお勧めします。

これにより、アプリケーションの実行状況を簡単に検査して、それに応じて改善することができます。


### 17. Laravelの一般的なパフォーマンスチューニングのヒント

Webサイトのパフォーマンスを最適化するには、次のようないくつかの調整を実装するだけです。

1. Laravelページスピードコンポーザーパッケージ
2. プロバイダーの詳細を更新する
3. パッケージを公開する
4. ミドルウェアを登録する
5. ページ上にルートを作成する
6. ブレードファイルを作成
7. アプリを実行

#### Laravelページスピードコンポーザーパッケージ

Composerを使用して、`renatomarinho/laravel-page-speed`パッケージをダウンロードと展開します。

```console
$ composer require renatomarinho/laravel-page-speed
```

#### プロバイダーの更新

`config/app.php`ファイルに移動し、サービスプロバイダーとエイリアスを展開します。

```config/app.php
'providers' => [
....
....
RenatoMarinho\LaravelPageSpeed\ServiceProvider::class,

```

#### パッケージの公開

```console
$ php artisan vendor:publish --provider="RenatoMarinho\LaravelPageSpeed\ServiceProvider"
```

#### Webアクセス用のミドルウェアを追加し、ルーティングに追加する

```Kernel.php
protected $middlewareGroups = [

   'web' => [

       ........

       ........

       \RenatoMarinho\LaravelPageSpeed\Middleware\InlineCss::class,

\RenatoMarinho\LaravelPageSpeed\Middleware\ElideAttributes::class,

\RenatoMarinho\LaravelPageSpeed\Middleware\InsertDNSPrefetch::class,

\RenatoMarinho\LaravelPageSpeed\Middleware\RemoveComments::class,

\RenatoMarinho\LaravelPageSpeed\Middleware\TrimUrls::class,

\RenatoMarinho\LaravelPageSpeed\Middleware\RemoveQuotes::class,

\RenatoMarinho\LaravelPageSpeed\Middleware\CollapseWhitespace::class,

  ]

]
```

```web.php
// Define Route
// I  going to add a route to check Optimized Website Speed and Performance in Laravel 5.5
Route::get('/listView', function () {
  return view('listView');
});
```

#### カスタムスタックによるパフォーマンスの向上

ThunderStackとして知られるカスタムスタックは、Laravelアプリのパフォーマンスを向上させるように設計されています。受賞したレシピは、ApacheとNGINX、Varnish、Memcachedで構成されています。


## 参考

[12 Tips for Laravel Performance Optimization in 2020](https://www.cloudways.com/blog/laravel-performance-optimization/)

## 感想とか

Laravelアプリが遅い。重い。
色々言われている所もあると思いますが、パフォーマンスチューニングで実施できることは結構ありますね。
~~すっごい遅いし重いしLaravelクッソだなぁと思ってブーメラン~~