検索とデバッグの後、これが機能した理由です:
'redis' => [
'client' => 'predis',
'cluster' => true,
'options' => [
'cluster' => 'redis',
'parameters' => [
'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_DEFAULT_PORT', 6379),
'database' => 0,
],
],
'clusters' => [
'default' => [
'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_DEFAULT_PORT', 6379),
'database' => 0,
],
'jobs' => [
'host' => env('REDIS_JOBS_HOST', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_JOBS_PORT', 6379),
'database' => 0,
],
'content' => [
'host' => env('REDIS_CONTENT_HOST', '127.0.01'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_CONTENT_PORT', 6379),
'database' => 0,
],
'options' => [
'cluster' => 'redis'
],
]
]
注:上記の質問での構成の明らかな間違いの1つは、ホストとポートを組み合わせたことです。これをここで修正しました。これは私の.envファイルがどのように見えるかです:
REDIS_DEFAULT_HOST=127.0.0.1
REDIS_JOBS_HOST=127.0.0.1
REDIS_CONTENT_HOST=127.0.0.1
REDIS_DEFAULT_PORT=7000
REDIS_JOBS_PORT=7001
REDIS_CONTENT_PORT=7002
注:次の手順を使用してクラスターを作成しました:https://redis.io/topics/cluster-tutorial#creating-the-cluster
調査方法
その事実のために:1。これに関するlaravel/predisのドキュメントが不足しています2。スタックオーバーフローに関する答えのほとんどは、次の線に沿っています:グーグルと検索の後..これが私にとってうまくいったことです 何が起こっているのかについて多くの説明なしで
方法を示すことで少し手伝うことができると思いました 上記の答えを見つけました。
1)エラーの問題を解決する
このバグを解決するには
local.ERROR:Symfony \ Component \ Debug \ Exception \ FatalThrowableError:Type error:引数1がPredis \ Connection \ Parameters ::__construct()に渡されるのは、/ Users / Shared / dev/phpで呼び出される整数型の配列である必要があります/toters-api/vendor/predis/predis/src/Connection/Factory.phpon行164in/ Users / Shared / dev / php / toters-api / vendor / predis / predis / src / Connection / Parameters.php:34Stack trace :
config/database.phpの形式が単に間違っていることに気づきました。全体をグーグルで検索しても明確な画像が得られなかったため、xdebugを使用してコードを詳しく調べることにしました。注:エラースタックトレース(上記の質問に表示)を1つのドキュメントに印刷し、それをデバッグ手順(つまり、常に出力を印刷しながらステップオーバー/イント/アウトなど)をガイドするための鳥瞰図として使用しました。別のドキュメントで、健全性チェック/デバッグコンパスとしてconfig /database.phpと比較します。
掘って印刷した後、私はこれに出くわしました:
[ *Locals ] [ Superglobals ] [ User defined constants ]
- Locals at /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php:55
▾ $options = (array [1])
\
⬦ $options["cluster"] = (string [5]) `redis`
/
▾ $parameters = (array [4])
\
⬦ $parameters[0] = (string [14]) `127.0.0.1:7000`
|
⬦ $parameters[1] = (null)
|
⬦ $parameters[2] = (int) 6379
|
⬦ $parameters[3] = (int) 0
/
▾ $this = (Predis\Client [3])
\
⬦ $this->connection = (null)
|
⬦ $this->options = (null)
|
⬦ $this->profile = (null)
/
これを.envファイルの内容と比較しました:
REDIS_DEFAULT_HOST=127.0.0.1:7000
REDIS_JOBS_HOST=127.0.0.1:7001
REDIS_CONTENT_HOST=127.0.0.1:7002
そして、フォーマットが間違っていることに気づきました。ホストとポートを同じ環境変数に入れるべきではないので、代わりにそのように置きます:
REDIS_DEFAULT_HOST=127.0.0.1
REDIS_JOBS_HOST=127.0.0.1
REDIS_CONTENT_HOST=127.0.0.1
REDIS_DEFAULT_PORT=7000
REDIS_JOBS_PORT=7001
REDIS_CONTENT_PORT=7002
それで私の最初の問題は解決しました。
2)その他の問題の解決
上記が修正された後、私はこれを手に入れました
CLUSTERDOWNハッシュスロットが提供されていません
これは非常に簡単で、エラーメッセージをグーグルで検索するだけでした(エラーメッセージは明らかにネイティブのredisエラーメッセージであり、predisエラーメッセージのような不可解なライブラリラッパーではなかったため)。そして私はこの答えを見つけました。
残りは簡単でした。