【问题标题】:Writing a subscribe method of RabbitMQ in PHP用PHP编写RabbitMQ的订阅方法
【发布时间】:2015-12-29 12:20:09
【问题描述】:

我有一个如下定义的函数:

public function subscribe($someQueue)
{
    $callback = function($msg){
        return $msg->body;
    };
    $this->channel->basic_consume( $someQueue, '', FALSE, TRUE, FALSE, FALSE, $callback);
    while(count($this->channel->callbacks)) {
         $this->channel->wait();
    }
}

我正在使用以下功能:

注意:以下行在不同的类文件中,因此创建了包含上述函数的类的对象。

$objRMQ = new RabbitMQ();
$msgBody = $objRMQ->subscribe("someQueue");
echo "message body returned from someMethod: ".$msgBody; 

基本上,我想将每条消息的正文返回给发布到队列的调用者函数。

当前输出:

message body returned from subscribe: NULL

预期输出:

holla, this is your message from queue

【问题讨论】:

    标签: php rabbitmq php-amqplib


    【解决方案1】:

    由于这个问题很老但仍然没有答案,我将给出一个简短的解释。您现在可能已经想出了答案,但这可能会帮助其他人在未来进行搜索。

    这里的关键概念是“异步执行”。

    当您使用basic_consume 方法订阅频道时,您不是要求立即执行一次回调,而是要求在消息可用时执行回调,然后每次有另一条消息可用时执行.

    对于AMQPLib,你通过重复调用wait()方法来等待新消息;即这里:

    while(count($this->channel->callbacks)) {
         $this->channel->wait();
    }
    

    仔细想想,你的代码有两个错误:

    • return $msg->body 行无处可返回。调用将在 wait() 方法的实现深处发生,并且您没有从 $this->channel->wait() 获得任何输出,因此无法使用该返回值做任何事情。
    • 另一方面,当您从其他类调用$objRMQ->subscribe("someQueue") 时,您希望它返回一些内容,但该函数没有return 语句。唯一的 return 语句位于您传递给 basic_consume 的匿名函数中。

    解决方案基本上是全部对消息进行处理 - echo $msg->body,或者您想要进行的任何实际处理 - 在回调中。如果您真的想在消息进入时收集数据,您可以将其保存到回调外部可访问的某个变量中,但请记住,您有时需要跳出wait() 循环才能对这些数据执行任何操作.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多