Predis协议错误:无效的批量长度

时间:2011-07-19 19:24:29

标签: php redis predis

我正在使用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,所以也许这搞砸了什么?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您必须使用mset

使用set命令,Predis正在寻找一个只有2个变量的数组(设置key =&gt;哈希)。设置3个键,你必须使用mset。

做你似乎想要做的事情:

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

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

答案 1 :(得分:1)

我发现了问题和解决方案。来自memcached将自动序列化数组,这在PRedis中是不一样的。 PRedis在执行set或get时绝不会序列化任何内容。

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