3

私はpredisを使用していますが、このエラーが発生するまではすべてが素晴らしかったです:

ERR Protocol error: invalid bulk length

なぜそれを取得しているのかわかりません。エラーはこのファイルにあります: このメソッドの Predis/Network/StreamConnection.php:

public function writeCommand(ICommand $command) {
    $commandId = $command->getId();
    $arguments = $command->getArguments();

    $cmdlen = strlen($commandId);
    $reqlen = count($arguments) + 1;

    $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandId}\r\n";
    for ($i = 0; $i < $reqlen - 1; $i++) {
        $argument = $arguments[$i];
        $arglen  = strlen($argument);
        $buffer .= "\${$arglen}\r\n{$argument}\r\n";
    }
    $this->writeBytes($buffer);
}

配列に対して strlen() を実行しようとすると失敗します。

これが失敗する原因となっているコードは次のとおりです。

$ids = array(1, 2, 3);
$predis = new Predis\Client();

$predis->set('testerKey', $ids);

配列を設定することはできませんか? もちろん、配列を設定できます。私が変更した唯一のことは、ファイルを UTF-8 にしたことでした。

どんな助けでも大歓迎です。

4

2 に答える 2

3

問題と解決策を見つけました。配列を自動的にシリアル化する memcached から来ると、これは PRedis とは異なります。PRedis は、set または get を実行するときに何もシリアライズしません。

https://github.com/nrk/predis/issues/29

于 2011-07-21T16:28:57.490 に答える
1

を使用する必要がありますmset

このsetコマンドを使用して、Predisは2つの変数のみを持つ配列を探しています(キー=>ハッシュを設定するため)。3つのキーを設定してください。msetを使用する必要があります。

あなたがやろうとしているように見えることをするために:

$ids = array(1 => 'id-1', 2 => 'id-2', 3 => 'id-3');
$predis = new Predis\Client();

$predis->mset('testerKey', $ids);
于 2011-07-20T00:56:02.753 に答える