【问题标题】:Predis Protocol error: invalid bulk lengthPredis 协议错误:无效的批量长度
【发布时间】:2011-10-08 20:02:47
【问题描述】:

我正在使用 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,所以这可能搞砸了?

任何帮助将不胜感激。

【问题讨论】:

    标签: php redis predis


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你必须使用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);
      

      【讨论】:

      • 不,我不想做多组。我想将该数组存储在一个键中。可能和编码有关,我最近把mac默认的编码改成了UTF-8。
      猜你喜欢
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      相关资源
      最近更新 更多