Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.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
从rabbitmq使用者获取队列大小';使用PhpAmqpLib的s回调_Php_Rabbitmq_Queue_Php Amqplib - Fatal编程技术网

从rabbitmq使用者获取队列大小';使用PhpAmqpLib的s回调

从rabbitmq使用者获取队列大小';使用PhpAmqpLib的s回调,php,rabbitmq,queue,php-amqplib,Php,Rabbitmq,Queue,Php Amqplib,我想从工人的回调中记录工作状态,并在左边的队列中包含许多消息 到目前为止,我找到的唯一解决方案是获取queue\u declareresult数组的第二个成员,但这应该在每个worker启动时调用一次,并且我需要在每次新消息时更新信息 UPD: 解决方案基于: queue\u declare方法有一个名为“passive”的参数,可用于此目的:它仅按名称检查队列是否存在,并忽略任何其他参数 根据: 如果已设置,则如果队列已存在且名称相同,则服务器将使用Declare Ok进行回复,如果不存在,则

我想从工人的回调中记录工作状态,并在左边的队列中包含许多消息

到目前为止,我找到的唯一解决方案是获取
queue\u declare
result数组的第二个成员,但这应该在每个worker启动时调用一次,并且我需要在每次新消息时更新信息

UPD: 解决方案基于:


queue\u declare
方法有一个名为“passive”的参数,可用于此目的:它仅按名称检查队列是否存在,并忽略任何其他参数

根据:

如果已设置,则如果队列已存在且名称相同,则服务器将使用Declare Ok进行回复,如果不存在,则引发错误。客户端可以使用它来检查队列是否存在,而无需修改服务器状态。设置时,将忽略除“名称”和“无等待”之外的所有其他方法字段。同时具有被动和无等待的声明无效。对参数进行语义等价性比较

请注意,
Declare Ok
不仅仅是一个状态,而且是的名称,包括字段
queue
message count
consumer count

在PHP AMQPLib中,您可以使用它来记录一组队列的状态,如下所示:

foreach($this->registeredQueues为$queueName){
//队列_声明的第二个参数是$passive
//当设置为true时,其他所有内容都将被忽略,因此不需要传递
列表($queueName、$messageCount、$consumerCount)
=$this->rabbitChannel->queue\u declare($queueName,true);
$this->logger->info(
“队列$queueName包含$messageCount消息和$consumerCount活动使用者。”
);
}

单独记录可能更好,您可以在memcached或redis中增加/减少计数器。我刚刚注意到您的标题是“PhpAmqp”,但您的标记包括“php amqplib”。PHP有两个不同的AMQP库,一个是,另一个是。这些功能几乎相同,但类和函数的名称不同,因此您可能需要澄清您使用的是哪一个。出于某种原因,消息计数始终为0。我用代码示例更新了问题。
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('test1');
echo "[*] Waiting for messages. To exit press CTRL+C\n";
$callback = function ($msg) use ($channel) {
    list (, $cn) = $channel->queue_declare('test1', true);
    echo ' [x] Received ', $msg->body, " $cn left";
    for ($i = 0; $i < $msg->body; ++$i) {
        sleep(1);
        echo '.';
    }
    echo "\n";
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume('test1', '', false, true, false, false, $callback);
while (count($channel->callbacks)) {
    $channel->wait();
}