问题标签 [php-amqplib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2533 浏览

php - 使用 PhpAmqpLib 从 rabbitmq 消费者的回调中获取队列大小

我想从工作人员的回调中记录工作状态,并在左侧队列中包含一些消息。

到目前为止,我发现的唯一解决方案是获取queue_declare结果数组的第二个成员,但这应该在每次工作人员启动时调用一次,并且我需要更新每条新消息的信息。

UPD:基于IMSoP 答案的解决方案:

出于某种原因,总是给出 0 作为消息计数。

0 投票
0 回答
66 浏览

php - 一段时间后,RabbitMQ 消费者翻倍

我们正在使用 RabbitMQ v3.7.5、AMQP 0.9.1、Erlang 20.1.7.1、PHP 7、centos 7

我们的消费者是使用 php-amqplib v2.9.1 编写的

我们通过使用 curl 调用 URL 来启动我们的消费者。消费者按预期工作了一段时间,但一段时间后所有消费者都翻了一番,即它显示两个连接正在为同一个消费者运行。一旦发生这种情况,当队列中有数据但队列中接收到的所有数据都丢失时,任何消费者都不会响应。

有没有人遇到过同样的问题?

消费者代码(我使用的是官方网站上给出的相同代码:https ://www.rabbitmq.com/tutorials/tutorial-two-php.html )

预期结果:消费者不应重复。

0 投票
1 回答
288 浏览

php - RabbitMQ 发布工作从控制台但不是从浏览器

我有一个简单的 PHP 代码,可以将消息发送到 RabbitMQ 队列,当我直接从控制台(#php script.php)执行它时,消息会正确发布,但是当我尝试使用浏览器打开相同的脚本时(http ://localhost/script.php)消息未发送。所有先前的行都已执行,但页面卡在行中

关于为什么会发生这种情况的任何想法?

代码:script.php

代码:rabbitmq_function.php

从 CLI:我得到两条调试消息(之前和之后),以及返回“1”值。而且我在 RabbitMQ 管理中看到了一条新消息。从浏览器:我只打印了“在 AMQP 连接之前”消息,队列中没有新消息

0 投票
0 回答
34 浏览

rabbitmq - RabbitMQ 队列随机变为空白,剩余大约 5K 条消息

我有一个发布大量消息的队列(~10K)。连接到此队列的是多个消费者,使用该php-amqplib库在 codeigniter 中使用以下代码

消息被填满并同时被多个这样的消费者消费。我观察到剩余一些 5-6k 消息(即在消耗大约 4-5k 条消息之后),队列突然变空,消费者空闲并等待更多消息。此外,此时 RabbitMQ 管理 Web 面板上的消息总数突然下降。

我试过用耐用参数制作队列,但问题似乎是一样的。可能是什么问题及其解决方案?

0 投票
1 回答
652 浏览

php - RabbitMQ 在来自交易所的消息的死信队列上的奇怪行为

我正在使用用于 php 的 amqp 库作为 rabbitmq 客户端,我们想拒绝来自名为“test”的队列中的消息

为了不丢失此消息,我们定义了名为“test.deadletter”的死信队列。

如果我们直接将消息添加到队列“test”(通过 web 界面)并通过 amqplib 客户端的 basic.reject 方法拒绝此消息,则消息将正确移动到死信队列。

但是,如果我们使用一些交换(带有路由密钥)将消息放入测试队列,然后我们尝试拒绝它,那么消息就会丢失。它不再在测试队列中,也不在 test.deadletter 队列中。

消息是相同的,basic.reject 方法所需的两个参数在两次尝试中都相同。没有区别,只是事实是,消息一次来自交换,另一次来自某些直接插入。

这是一种错误还是预期的行为?我错过了什么?

此致

0 投票
1 回答
2067 浏览

php - PHP ampq + rabbit MQ——长时间运行的生产者:可以向已经声明的队列发送消息,但不能声明新的队列

我有一个应该始终运行的“生产者”,但似乎在一天左右之后,它仍然能够将消息发送到它之前声明的队列,但是当尝试声明一个新队列时,它会爆炸:

我以为心跳只针对消费者(因为没有地方检查生产者的心跳)?当我不是“消费者”时检查心跳是否是一个错误?

还是当我声明队列时我的脚本也成为“消费者”,因为它需要“消费”来自服务器的反馈,即队列已准备好使用或其他什么?

它目前的设置方式,我可以定期使用什么解决方法来检查它是否queue_declare会在运行时爆炸,这样当我确实需要运行queue_declare时它不会意外爆炸?

我正在使用AMQPSSLConnection最新版本(2.9.2),并且$connection->isConnected()一直在返回true。心跳设置为 15 秒。

0 投票
1 回答
42 浏览

rabbitmq - 如何使用 RabbitMQ 从具有自定义名称(动态定义)的队列中消费

我有一个 id 的任务,每个任务都有一些工作要做:

  • 每个用户的每个工作;
  • 对于每个任务,用户数和作业数都不同。

而且我想把所有的作业放到一个名为task{id}的队列中,这样我就可以控制任务何时完成(通过空队列task{id}),并在rabbitMQ的帮助下自动删除它,并控制一些从事一项任务{id}的消费者。

而且我希望我的消费者一直像守护进程一样工作,并自动选择带有作业的队列来使用。

这里的主要问题是如何获取消费者内部的任务名称以将它们绑定到它?或者也许在不知道队列名称的情况下,rabbitMQ 可能还有其他技巧可以做到这一点?

0 投票
1 回答
3388 浏览

php - 使用 composer 安装 php-amqplib(RabbitMQ) 失败

我正在尝试使用这个库。php-amqplib

composer require php-amqplib/php-amqplib

但我收到此错误:

0 投票
2 回答
260 浏览

rabbitmq - 将消息从 RabbitMQ 分发给在 Heroku dynos 上运行的消费者作为“循环”

我有一个 RabbitMQ 设置,其中作业被发送到交换器,交换器将它们传递到队列。消费者依次正确执行队列中的作业。然而,这些工作是漫长的过程(至少几分钟)。为了可扩展性,我需要能够让多个消费者从队列顶部选择一个作业并执行它。

消费者正在一个名为“队列”的 Heroku 测功机上运行。当我缩放测功机时,它似乎为每个测功机创建了额外的消费者(我可以在 RabbitMQ 仪表板上看到这些)。然而,队列中的任务数量没有改变——额外的消费者似乎什么都不做。请查看下图以了解我的设置。

RabbitMQ 设置

我在这里错过了什么吗?

  1. 为什么消费者显示为“空闲”?我从我的日志中知道,至少有一个消费者正在积极地完成一项任务。
  2. 当至少有一个消费者肯定在努力工作时,我的消费者利用率怎么可能是 0%。
  3. 我怎样才能让其他三个消费者真正从队列中拉出一些工作?

谢谢

编辑:我发现循环调度实际上是有效的,但前提是当消息发送到队列时其他消费者已经在运行。这对我来说似乎是违反直觉的行为。如果我看到一个很大的队列并想添加更多的消费者,那么添加的消费者不会做任何事情,直到更多的项目被添加到队列中。

0 投票
1 回答
579 浏览

php - RabbitMQ - 如何使用多个通道重用相同的连接

我正在尝试掌握 RabbitMQ 的一些最佳实践。我的目标是创建一个连接,然后在这个连接上使用,在这个连接上创建多个通道。

按照 RabbitMQ 和 php-amqplib 文档,创建一个新的连接看起来像这样。

代码继续

我将此代码保存在文件 test.php 中。然后我继续打开两个终端会话,并在每个会话上运行以下

我可以看到两个通道都打开并等待。但是,当我访问 RabbitMQ 的管理 UI 页面并单击连接选项卡时,我可以看到列出了 2 个连接,每个连接有 1 个通道。我希望只看到 1 个连接,有 2 个频道。