Laravel Redisのライブラリをインストールしたらエラーが発生した

# 目的

- LaravelのセッションをAWSのElastiCatcheで管理しようと思いpredis/predisをインストール後にローカルサーバを起動したときのエラーの解決方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 6.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 前提情報

- 下記作業を実施時のライブラリのインストール後にブラウザに出たエラーを解決する。
    - [Laravel キャッシュファイルをAWSのElasticCacheに保存する]()
- 今回問題になっているLaravelアプリはMacのローカルに直接作成したアプリである。Dockerなどは使用していない。

# 問題までの経緯

1. アプリ名ディレクトリで下記コマンドを実行してライブラリを取得した。

    ```terminal
    $ composer require predis/predis
    ```
1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動した。

    ```terminal
    $ php artisan serve
    ```
1. 当該アプリの.envファイルの`SESSION_DRIVER=file`の記載を`SESSION_DRIVER=redis`に変更した。
1. 下記にアクセスした。
    - [http://127.0.0.1:8000/](http://127.0.0.1:8000/)

# 問題

- ブラウザで下記のエラーが表示された。
    - `Please make sure the PHP Redis extension is installed and enabled.`
    - 訳: PHPRedis拡張機能がインストールされ有効になっていることを確認してください。

    ![🧨_Please_make_sure_the_PHP_Redis_extension_is_installed_and_enabled__と_ElastiCatche.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a59ebbba-b627-618a-00e8-98858faa107a.png)


# 問題解決までの経緯

1. おそらく.envファイルの`SESSION_DRIVER=`が`SESSION_DRIVER=redis`となっているときにPhpRedis PHP拡張が導入されていないと本エラーが出るようである。公式ドキュメントでRedisを使用する際はPhpRedis PHP拡張を入れて使うことが推奨されている。
1. とはいえpredis/predisのライブラリが入っていれば動くはずであるが、推奨されている通りにPhpRedis PHP拡張を入れたら解決しそうである。
1. 下記方法でMacのローカルにPhpRedis PHP拡張をインストールした。
    - [Mac PhpRedis PHP拡張をインストールする]()
1. ローカルサーバを起動して下記にアクセスしてみた。
    - [http://127.0.0.1:8000/](http://127.0.0.1:8000/)
1. 一向にページが表示されず挙げ句には下記のエラーを返してきた。
    - `Operation timed out`
1. 下記の公式ドキュメントを見ていったらpredis/predisのライブラリを使用する際はconfig/database.phpのredis配列のclientキーの第二引数を'predis'に書き換えろと書いてあったPhpRedis PHP拡張をインストールしてしまったが本方法を試してみる。
    - [Laravel 6.x Redis](https://readouble.com/laravel/6.x/ja/redis.html)
1. 下記コマンドを実行してPhpRedis PHP拡張をアンインストールする。

    ```terminal
    $ pecl uninstall redis
    ```
1. 下記コマンドを実行してphp.iniファイルの場所を出力する。

    ```terminal
    $ php -r "echo phpinfo();" | grep "php.ini"
    ```
1. 下記コマンドを実行してphp.iniファイルのバックアップを作成する。（下記コマンドは筆者の環境でのphp.iniファイルの場所を指しており、皆さんは先のコマンドで出力されたphp.iniのパスを指定してバックアップを作成していただきたい。）
    
    ```terminal
    cp /usr/local/etc/php/7.4/php.ini /usr/local/etc/php/7.4/php.ini_org
    ```
1. 下記コマンドを実行してphp.iniファイルを開く。（下記コマンドは筆者の環境でのphp.iniファイルの場所を指しており、皆さんは先のコマンドで出力されたphp.iniのパスを指定してファイルを開いていただきたい。）

    ```terminal
    $ vi /usr/local/etc/php/7.4/php.ini
    ```
1. ファイルに下記の記載があるはずなのでコメントアウト後に保存する。
    - 修正前

        ```/usr/local/etc/php/7.4/php.ini
        extension="redis.so"
        ```
    - 修正後

        ```/usr/local/etc/php/7.4/php.ini
        ;extension="redis.so"
        ```
1. アプリ名ディレクトリで下記コマンドを実行して設定ファイルを開く。

    ```terminal
    $ vi config/database.php
    ```
1. 下記のように修正した。
    - 修正前

        ```config/database.php
        /*
        |--------------------------------------------------------------------------
        | Redis Databases
        |--------------------------------------------------------------------------
        |
        | Redis is an open source, fast, and advanced key-value store that also
        | provides a richer body of commands than a typical key-value system
        | such as APC or Memcached. Laravel makes it easy to dig right in.
        |
        */
    
        'redis' => [
    
            'client' => env('REDIS_CLIENT', 'phpredis'),
    
            'options' => [
                'cluster' => env('REDIS_CLUSTER', 'redis'),
                'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
            ],
    
            'default' => [
                'url' => env('REDIS_URL'),
                'host' => env('REDIS_HOST', '127.0.0.1'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', '6379'),
                'database' => env('REDIS_DB', '0'),
            ],
    
            'cache' => [
                'url' => env('REDIS_URL'),
                'host' => env('REDIS_HOST', '127.0.0.1'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', '6379'),
                'database' => env('REDIS_CACHE_DB', '1'),
            ],
    
        ],
        ```
    - 修正後

        ```config/database.php
        /*
        |--------------------------------------------------------------------------
        | Redis Databases
        |--------------------------------------------------------------------------
        |
        | Redis is an open source, fast, and advanced key-value store that also
        | provides a richer body of commands than a typical key-value system
        | such as APC or Memcached. Laravel makes it easy to dig right in.
        |
        */
    
        'redis' => [
    
            /* 下記を修正した */
            'client' => env('REDIS_CLIENT', 'predis'),
    
            'options' => [
                'cluster' => env('REDIS_CLUSTER', 'redis'),
                'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
            ],
    
            'default' => [
                'url' => env('REDIS_URL'),
                'host' => env('REDIS_HOST', '127.0.0.1'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', '6379'),
                'database' => env('REDIS_DB', '0'),
            ],
    
            'cache' => [
                'url' => env('REDIS_URL'),
                'host' => env('REDIS_HOST', '127.0.0.1'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', '6379'),
                'database' => env('REDIS_CACHE_DB', '1'),
            ],
    
        ],
        ```
1. 別のエラーが発生したが問題になっていたPhpRedis PHP拡張が存在しない旨のエラーは出なくなった。