使用php-amqlib从RabbitMQ读取消息不起作用

时间:2017-08-23 09:48:29

标签: php rabbitmq amqp php-amqplib

我正在使用php-amqplib与PHP和RabbitMQ进行客户端 - 服务器通信。

我有一个生产者脚本,看起来工作正常,但我的消费者没有收到任何东西。

我用sudo rabbitmqctl list_queues检查队列中的条目,每次运行生产者后,计数器都会增加。

我的消费者在没有任何PHP错误的情况下启动,看起来像是在等待消息。 什么看起来不太好它在启动时使用空传入消息运行一次回调脚本 - 而不是做任何事情。

php consumer.php 
string(47) " [*] Waiting for messages. To exit press CTRL+C"
string(1) "
"
string(10) "Received: "

以下是我的代码:

producer.php

public function sendDataToRabbitMQ()
{
    $id = $_POST['id'];
    $ipAddress = $_POST['ip'];
    $date = date("Y-m-d h:i:s");
    $status = false;

    $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); //host: RABBITMQ_HOST
    $channel = $connection->channel();

    $channel->queue_declare('first_queue', false, true, false, false);

    if(is_array($argv)) {
        $data = implode(' ', array_slice($argv, 1));
    }

    if (empty($data)) {
        $data = "$ipAddress,$id";
    }

    $msg = new AMQPMessage($data, array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));

    $channel->basic_publish($msg, '', 'first_queue');

    echo " [x] Sent data:", "\n", $data, "\n";

    $channel->close();
    $connection->close();

    return $result;
}

(将主机名常量更改为localhost以进行测试)

consumer.php

<?php

require_once '../vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

class Consumer
{
    private $token;

    private function getQueue()
    {
        $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
        $channel = $connection->channel();

        $channel->queue_declare('ban_queue', false, true, false, false);

        var_dump(' [*] Waiting for messages. To exit press CTRL+C', "\n");

        $callback = function($msg) {

            $message = explode(',', $msg->body);

            var_dump('Received: '.$message[0]);

            $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
        };

        $channel->basic_qos(null, 1, null);
        $channel->basic_consume('first_queue', '', false, false, false, false, $callback);
        while (count($channel->callbacks)) {
            $channel->wait();
        }
        $channel->close();
        $connection->close();
    }

    public function processResult()
    {
        $this->getQueue();
    }

}

$consumer = new Consumer();
$consumer->processResult();

为什么不起作用?我发现rabbitmq / php-amqplib教程和文档相当无用,现在已经超过半天完全触及了这个问题。任何帮助表示赞赏。

更新1

我还从此网站检查了此QA,我的代码与之相符。

1 个答案:

答案 0 :(得分:2)

经过一段时间的研究和测试后,我找到了上述问题的解决方案:

我改变了

$channel->basic_consume('first_queue', '', false, false, false, false, $callback);

$channel->basic_consume('first_queue', '', false, true, false, false, $callback);

这就成了伎俩。