【Laravel】デプロイの際やっていおいた方が良いこと

## オートローダー最適化

本番環境へデプロイする場合、アプリケーションの自動ロードを高速化するクラスマップを作成して、Composerが、指定されたクラスのファイルを素早く見つけ、ロードできるようにします。

```shell
$ composer install --optimize-autoloader --no-dev
```

もしくはcomposer.jsonの中身において

```php
{
  "config": {
    "optimize-autoloader": true
  }
}
```

と設定すれば

```shell
$ composer install --no-dev
```

で済みます。

上記コマンドを実行すると、return arrayの箇所に変更が入り、クラスマップを作成してくれます。



```php:vendor/composer/autoload_classmap.php
<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'App\\Console\\Kernel' => $baseDir . '/app/Console/Kernel.php',
    'App\\Enums\\Constant' => $baseDir . '/app/Enums/Constant.php',
    'App\\Exceptions\\FileUploadException' => $baseDir . '/app/Exceptions/FileUploadException.php',
    'App\\Exceptions\\Handler' => $baseDir . '/app/Exceptions/Handler.php',

... 中略 ...

);
```

他にも以下のファイルにも変更が入るようです。

```php
vendor/composer/autoload_files.php
vendor/composer/autoload_namespaces.php
vendor/composer/autoload_psr4.php
vendor/composer/autoload_real.php
```

- no-devを使用すると、required-dev内のパッケージのインストールは全てスキップされます。（開発で使用されるパッケージは削除されます）

- class not foundのエラーが出た時は、対象のオートロードに開発時のみ必要とするパッケージを参照する必要が出てきてしまった、というパターンが多いです。その時は、対象のライブラリをrequire-devからrequireに移動させる必要があります。

```shell
$ composer require {対象ライブラリ}
```

その後、再度オートローダー最適化を行うと良い。

## 設定ローディングの最適化

```shell
$ php artisan config:cache
```

上記のコマンドで生成されるファイルの中身は以下の通りです。



```php:bootstrap/cache/config.php
<?php return array (
  'app' => 
  array (
    'name' => 'SAMPLE PROJECT',
    'env' => 'local',
    'debug' => true,
    'url' => 'http://localhost',
    'asset_url' => NULL,
    'timezone' => 'Asia/Tokyo',
    'locale' => 'ja_JP',
    'fallback_locale' => 'ja_JP',
    'faker_locale' => 'ja_JP',
    'key' => 'base64:vE9tPBe2snc5C+AVFhuGSAUzuocPX5R7yjeFLvZ0nTU=',
    'cipher' => 'AES-256-CBC',
    'maintenance' => 
    array (
      'driver' => 'file',
    ),
    'providers' => 
    array (
      0 => 'Illuminate\\Auth\\AuthServiceProvider',
      1 => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',

... 中略 ...

)
);
```

このコマンドは、.envやconfig配下の全設定ファイルを1つのファイルへまとめるため、設定値をロードする場合に、数多くのファイルにアクセスする手間を減らします。

また、このキャッシュファイルがあれば元の.envは読み込まなくなります。

## ルートロードの最適化

```shell
$ php artisan route:cache
```

上記のコマンドで生成されるファイルの中身は以下の通りです。



```php:bootstrap/cache/routes-v7.php
<?php

/*
|--------------------------------------------------------------------------
| Load The Cached Routes
|--------------------------------------------------------------------------
|
| Here we will decode and unserialize the RouteCollection instance that
| holds all of the route information for an application. This allows
| us to instantaneously load the entire route map into the router.
|
*/

app('router')->setCompiledRoutes(
    array (
  'compiled' => 
  array (
    0 => false,
    1 => 
    array (
      '/sanctum/csrf-cookie' => 
      array (
        0 => 
        array (
          0 => 
          array (
            '_route' => 'sanctum.csrf-cookie',
          ),
          1 => NULL,
          2 => 
          array (
            'GET' => 0,
            'HEAD' => 1,
          ),
          3 => NULL,
          4 => false,
          5 => false,
          6 => NULL,
        ),
      ),

... 中略 ...

)
);
```

routeの数が大きいプロジェクトではパフォーマンスの改善に期待できる仕組みです。

## ビューロードの最適化

```shell
$ php artisan view:cache
```

このコマンドは全Bladeファイルをコンパイルします。

要求ごとにコンパイルしなくて済むため、ビューを返すリクエストすべてにおいてパフォーマンスが向上します。

以上