Redis の使用バグ記録 (exec)
プロジェクトで、ブロガーはツール クラスで Redis クラスを使用しました。Redis はパイプラインのパイプラインと exec コマンドをカプセル化していなかったため、ペン ストロークで作成しました。 __call;
コードの一部は次のとおりです ($this->_connect() は Redis インスタンスを返します)。
その後何が起こったかはもう中国語では表現できません、コードは次のとおりです
$redis->pipeline();
$redis->lpop($key);
$redis->lpop($key);
$redis->exec();
自分で簡単なサンプル テストを作成した後、通常の状況では、$key キューのスタックの上位 2 つの要素、つまり array('item1','item2'); が返されるはずですが、今回は最終的な返結果が返されます。 NULL であることが判明しました、ブロガーさん、このとき、
は非常に混乱していました。もしかしたら、適用された関数 call_user_fun_array() に戻り値がないのではないか、これは私の父を騙すことになるのではないでしょうか?これは単なる個人的な推測です。PHP の宝典にはそのような説明はありませんが、以下の例を見て自分でテストしてください。戻り値、つまり、この推測は失敗しました。
さて、時間が経ってもまだ問題が見つからないので、会社の同僚にアドバイスを求めました。 $this ->_connect() は redis オブジェクトであるため、$this->_redis へのハンドルはないのですか?何か魔法のようなことが起こり、戻り値が返されます。
わかりました。これで、$this->_connect() と $this-> について何があるかがわかります。 _redis 上記のコードと同様に、2 つの変数を直接ダンプします。後で、これが事実であることがわかりました。下の写真を見ている当局者は、これらが 2 つの異なるリソースであることを理解する必要があります。
問題はわかった気がしたので、_connect() 関数に戻ったところ、そこに Redis シングルトンがないことがわかりました。毎回新しい Redis オブジェクトが作成されていました。 。それで、問題をまだ知らない読者は引き続き私をフォローしてください。
この問題については、当社の技術者は何も言いません。Redis 操作コマンドのバッチでは、3 つの異なる Redis オブジェクトが使用されています。直接の実行であり、パイプラインがなかったので、NULL に違いありません。信じられますか? とにかく、私はそれを信じていました、そしてもちろん、私は騙したのです。自分自身。事の真相が今明かされる。怪物を倒すには自滅の道があった。