Laravel

LaravelのRedisで「array_key_exists() expects parameter 2 to be array, int given」の解決方法

いつもご利用ありがとうございます。このブログは、広告費によって運営されています。

オススメ本
Web技術を勉強するなら、かなりオススメの雑誌です。毎月新しい発見があります。ついに最終号・・・、みなさん買いましょう!!
読んで損することはない名著。命名で悩むことが多い人はこの本がオススメです。

⇨ Laravel 記事の目次はこちら

Laravel の Redis の設定をしている際に、

「arraykeyexists() expects parameter 2 to be array, int given」

とエラーが出てしまった時の解決方法についてまとめました。

検証した環境

PHP 7.4
Laravel 6
predis 2.2
クラスターモード

結論

config/database.php の記述が間違っている。

本来、配列が予期されているところに数字が来てしまっている。

'redis' => [
    'client' => env('REDIS_CLIENT', 'predis'),
        'options' => [
          'cluster' => env('REDIS_CLUSTER', 'redis'),
        ],
        'clusters' => [
            'default' => [
                [
                    'host' => env('REDIS_HOST', 'localhost'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                    'read_write_timeout' => 0,
                ],
            ],
        ],
    ],

この default の部分が、以下のように間違っていた。

//これは間違っている時の例
'default' => [
  'host' => env('REDIS_HOST', 'localhost'),
  'password' => env('REDIS_PASSWORD', null),
  'port' => env('REDIS_PORT', 6379),
  'database' => 0,
  'read_write_timeout' => 0,
],

クラスタモードと通常モードで default 以下の構造が違う

通常の書き方

'default' => [
    'host' => env('REDIS_HOST', 'localhost'),
    'password' => env('REDIS_PASSWORD', null),
    'port' => env('REDIS_PORT', 6379),
    'database' => 0,
    'read_write_timeout' => 60,
],

クラスタの書き方

  'default' => [
      [
          'host' => env('REDIS_HOST', 'localhost'),
          'password' => env('REDIS_PASSWORD', null),
          'port' => env('REDIS_PORT', 6379),
          'database' => 0,
      ],
  ],

ここだけピックアップして見ると違うことに気づきやすいですが、その他色々書かれている状況だとなかなか気づきにくいです。

ちなみに、僕はクラスタモードに変更する際に、通常の default のところをコピーして使用したため残念ながらここでハマってしまいました。

まとめ

以上です。誰かの参考になればと思います。

このブログは広告のクリックによって支えられています。ありがとうございます。

それでは!

人気記事

PHP7.4 + Laravel6 のプロジェクトを AWS EC2 にデプロイする

【laravel-breadcrumbs】Laravel でパンくずリストを実装する