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 中是不一样的。在执行 set 或 get 时,PRedis 永远不会序列化任何内容。

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 回答