Laravel公式ドキュメントから最適化の方法について学んでみた

# はじめに

Laravel 公式ドキュメントの Optimization（最適化）を読んで、学んだことをまとめてみました。

https://laravel.com/docs/10.x/deployment#optimization

# Autoloader Optimization

PHPライブラリを管理するツール Composer に関する内容です。  
運用環境にデプロイするときは以下のコマンドを実行すべきと書かれています。

```bash
composer install --optimize-autoloader --no-dev
```

`composer install` はライブラリをインストールする際に使用するコマンドです。
運用環境と開発環境で違うのは `--optimize-autoloader` `--no-dev` オプションが付加されている点です。

## --optimize-autoloader

オートローダーの最適化に関するオプションです。クラスマップというファイルを生成しておくことで、クラスの読み込み時間を短縮できるようです。

**vendor\composer\autoload_classmap.php** にクラスマップが生成されているので確認してみました。すると、上記のコマンドを未実行にも関わらず既にファイルが作成されており、最適化された内容が出力されていました。なぜ…？

Composer のドキュメントを確認してみると、最適化に関する同様の記述がありました。どうやら、クラスマップを生成する方法が他にもあるようです。

https://getcomposer.org/doc/articles/autoloader-optimization.md#optimization-level-1-class-map-generation

> There are a few options to enable this:  
> * Set "optimize-autoloader": true inside the config key of composer.json  
> * Call install or update with -o / --optimize-autoloader  
> * Call dump-autoload with -o / --optimize  

そこで composer.json を確認してみると以下の記述がありました。

```json:composer.json
    "config": {
        "optimize-autoloader": true,
```

つまり、`--optimize-autoloader` オプションを付加しなくても、composer.json に `"optimize-autoloader": true` があるので最適化される状態になっていました。

ということは `--optimize-autoloader` は不要かもしれません。（オプションを付加しても損はないので、心配であれば付加しましょう）

## --no-dev

composer.json の **"require-dev"** に記述されているライブラリをインストールしないようにするオプションです。"require-dev" には開発時に用いられるライブラリを記述するので運用環境では不要です。忘れずにオプションを付加しましょう。

```json:composer.json
    "require-dev": {
        "fakerphp/faker": "^1.9.1",
        "laravel/pint": "^1.0",
        "laravel/sail": "^1.18",
        "mockery/mockery": "^1.4.4",
        "nunomaduro/collision": "^7.0",
        "phpunit/phpunit": "^10.1",
        "spatie/laravel-ignition": "^2.0"
    },
```

# Caching Configuration

設定ファイル（config）のキャッシュに関する内容です。
運用環境にデプロイするときは以下のコマンドを実行すべきと書かれています。

```bash
php artisan config:cache
```

実行すると **bootstrap\cache\config.php** が生成されます。
設定ファイルを1つにまとめることで、読み込みを効率よく行えるようです。

```php:config.php（一部抜粋）
<?php return array (
  'app' => 
  array (
    'name' => 'Laravel',
    'env' => 'local',
    'debug' => true,
    'url' => 'http://localhost',
    'asset_url' => NULL,
    'timezone' => 'UTC',
    'locale' => 'en',
    'fallback_locale' => 'en',
    'faker_locale' => 'en_US',
```

作成したキャッシュを削除したい場合は以下のコマンドを実行してください。

```bash
php artisan config:clear
```

ちなみに、キャッシュの生成有無は以下のコマンドで確認することが可能です。

```bash
php artisan about

  Cache .......................................................  
  Config ............................................... CACHED  
  Events ........................................... NOT CACHED  
  Routes ........................................... NOT CACHED  
  Views ............................................ NOT CACHED
```

# Caching Events

イベント（events）のキャッシュに関する内容です。
アプリケーション内でイベントを利用している場合は、以下のコマンドを実行すべきと書かれています。

```bash
php artisan event:cache
```


実行すると **bootstrap\cache\events.php** が生成されます。

```php:events.php（一部抜粋）
<?php return array (
  'App\\Providers\\EventServiceProvider' => 
  array (
    'Illuminate\\Auth\\Events\\Registered' => 
    array (
      0 => 'Illuminate\\Auth\\Listeners\\SendEmailVerificationNotification',
```

作成したキャッシュを削除したい場合は以下のコマンドを実行してください。

```bash
php artisan event:clear
```

# Caching Routes

ルート（routes）のキャッシュに関する内容です。
大規模なアプリケーションを構築する場合は以下のコマンドを実行すべきと書かれています。

```bash
php artisan route:cache
```

実行すると **bootstrap\cache\routes-v7.php** が生成されます。
ルートのファイルを1つにまとめることで、パフォーマンスの向上が見込まれるようです。

```php:routes-v7.php（一部抜粋）
<?php
app('router')->setCompiledRoutes(
    array (
  'compiled' => 
  array (
    0 => false,
    1 => 
    array (
      '/sanctum/csrf-cookie' => 
      array (
        0 => 
        array (
          0 => 
          array (
            '_route' => 'sanctum.csrf-cookie',
```

作成したキャッシュを削除したい場合は以下のコマンドを実行してください。

```bash
php artisan route:clear
```

# Caching Views

ビュー（views）のキャッシュに関する内容です。
運用環境にデプロイするときは以下のコマンドを実行すべきと書かれています。

```bash
php artisan view:cache
```

実行すると **storage\framework\views** にファイルが生成されます。
Bladeファイルを事前にコンパイルしておくことで、パフォーマンスの向上が見込まれるようです。

作成したキャッシュを削除したい場合は以下のコマンドを実行してください。

```bash
php artisan view:clear
```

# まとめ

運用環境でのパフォーマンス向上を求める場合は、以下のコマンドを実行してみましょう。

```bash:
composer install --optimize-autoloader --no-dev
php artisan config:cache
php artisan event:cache
php artisan route:cache
php artisan view:cache
```