AMQPRuntimeException:读取数据时出错。收到0而不是预期的7个字节

时间:2014-08-10 07:47:30

标签: php rabbitmq amqp

它正在运作,但现在它已经无法使用了!

我正在使用php-amqplib和RabbitMQ。

当我尝试创建新的AMQP连接时:

$connection = new AMQPConnection('localhost', 5672, 'username', 'password');

导致此错误的库中的代码是:

public function read($n)
{
    $res = '';
    $read = 0;

    while ($read < $n && !feof($this->sock) &&
        (false !== ($buf = fread($this->sock, $n - $read)))) {

        if ($buf === '') {
            continue;
        }

        $read += strlen($buf);
        $res .= $buf;
    }

    if (strlen($res)!=$n) {
        throw new AMQPRuntimeException("Error reading data. Received " .
            strlen($res) . " instead of expected $n bytes");
    }

    return $res;
}

当我把它放在异常之前时:

die($res." :".$n);

结果是:

Ï :7 :7

它被调用两次,在第一次调用时,$ res是两个空字符,然后是“Ï”

并且在第二次调用中它只是null。

哦,我手动删除了rabbitmq数据库的mnesia文件夹中的文件一次,我不知道是否会导致问题,但RabbitMQ Management是一个在端口15672上运行的基于Web的应用程序工作正常。

3 个答案:

答案 0 :(得分:9)

我找到了解决方案。

我使用的用户无法访问vhost,因此在RabbitMQ Management中,我转到了admin选项卡并单击了用户名,然后单击了“set permission”按钮。

答案 1 :(得分:4)

如果端口号错误,您也会收到此错误。我错误地使用管理端口15672而不是服务器端口5672,并且遇到了同样的错误。

因此,如果用户权限调整不起作用,请检查连接参数。

答案 2 :(得分:1)

我知道这已经得到了解答,但这是另一个可能的原因:

默认&#34;来宾&#34;用户只能通过localhost连接,默认情况下。 https://www.rabbitmq.com/access-control.html

我得到了这个&#39;收到0&#39;在本地成功测试后第一次尝试远程连接时出错。设置不同的用户为我解决了这个问题。

rabbitmqctl add_user newuser <PASSWORD>
rabbitmqctl set_permissions -p / newuser ".*" ".*" ".*"

这个和许多其他可能的答案也在github here