PHP RabbitMQ setTimeout或其他选项停止等待队列

时间:2015-11-26 05:01:35

标签: php rabbitmq wait amqp php-amqplib

我需要创建一个简单的队列管理器来将数字从发件人传递给消费者。 RabbitMQ提供的Hello World教程几乎覆盖了70%。

但我需要将队列更改为不会永远等待传入的消息。或者在一定数量的消息后停止等待。我阅读并尝试了其他帖子中的一些解决方案,但它不起作用。

rabbitmq AMQP::consume() - 未定义的方法。还有另一种方法,wait_frame,但它受到保护。

和其他帖子是python,我不明白。

<?php

require_once __DIR__ . '/vendor/autoload.php';
require 'config.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

function recieveQueue($queueName){
    $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

    // try{
    //  $connection->wait_frame(10);
    // }catch(AMQPConnectionException $e){
    //  echo "asdasd";
    // }

    $channel = $connection->channel();

    $channel->queue_declare($queueName, false, false, false, false);

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

    $callback = function($msg) {
        echo " [x] Received ", $msg->body, "\n";

    };

    // $tag = uniqid() . microtime(true);
    // $queue->consume($callback, $flags, $tag);

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

    // $channel->cancel($tag);

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

    echo "\nfinish";
}

recieveQueue('vtiger');

?>

3 个答案:

答案 0 :(得分:8)

在while循环中修改wait():

$timeout = 55;
while(count($channel->callbacks)) {
    $channel->wait(null, false, $timeout);
}

答案 1 :(得分:6)

等待功能仅适用于套接字,我们必须捕获异常:

RenderModel

答案 2 :(得分:0)

这就是我向队列发出信号以停止消费传入消息的方法。

然而,这可能不是一种正确的方法,因为它会给出错误而不是正确出现。

请提出更好的答案。

    $callback = function($msg) {
        echo " [x] Received ", $msg->body, "\n";

        // if queue recieve 'stop', stop consume anymore messages
        if ($msg->body == 'stop'){
            $channel->basic_cancel($queueName);
        }
    };

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

    $timeout = 10;
    while(count($channel->callbacks)) {
        // $channel->wait(null, false, $timeout);
        $channel->wait();
    }