Ошибка протокола Predis: неверная общая длина - PullRequest
2 голосов
/ 19 июля 2011

Я использую 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 ]

1 голос
/ 21 июля 2011

Я нашел проблему и решение. Исходя из memcached, где он будет автоматически сериализовать массив, это не то же самое в PRedis. PRedis никогда не будет сериализовать что-либо при выполнении набора или получения.

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

1 голос
/ 20 июля 2011

Вы должны использовать 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);
...