Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP RabbitMQ setTimeout或其他选项停止等待队列_Php_Rabbitmq_Wait_Amqp_Php Amqplib - Fatal编程技术网

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

PHP RabbitMQ setTimeout或其他选项停止等待队列,php,rabbitmq,wait,amqp,php-amqplib,Php,Rabbitmq,Wait,Amqp,Php Amqplib,我需要创建一个简单的队列管理器来将一个数字从发送者传递给消费者。RabbitMQ提供的Hello World教程几乎涵盖了其中的70% 但我需要将队列更改为不永远等待传入消息。或者在收到一定数量的消息后停止等待。我读了其他帖子并尝试了一些解决方案,但都不起作用 -未定义的方法。还有另一种方法,wait_frame,但它是受保护的 还有一篇文章是用python写的,我不懂 <?php require_once __DIR__ . '/vendor/autoload.php'; requir

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

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

-未定义的方法。还有另一种方法,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');

?>

在while循环中修改wait():

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

这就是我如何向队列发出停止使用传入消息的信号

然而,这可能不是一个正确的方法,因为它给出了一个错误而不是正确的结果

如果有更好的答案,请建议一个

    $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();
    }

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

 $timeout = 5;
    while (count($channel->callbacks)) {
        try{
            $channel->wait(null, false , $timeout);
        }catch(\PhpAmqpLib\Exception\AMQPTimeoutException $e){
            $channel->close();
            $connection->close();
            exit;
        }
    }

“null”和“false”代表什么?还有,我想知道,在收到来自生产者的“停止”信号后,是否有一种停止等待的方法?
公共函数等待($allowed\u methods=null,$non\u blocking=false,$timeout=0)
如果您将工作人员作为cronjob运行,这是一种常见的做法吗?如果您可以使用
频道->等待(null,$nonBlockinge=true),那就太好了
无需指定超时,但它看起来像是一个非阻塞消费本身,在被请求后从未到达@mnv在什么地方有
wait()
的手册页吗?您可能只是从源代码中提取了这一行,但是对函数和参数的解释会有所帮助。