问题标签 [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 投票
0 回答
397 浏览

php - RabbitMQ PHP:从队列接收并将响应发送到另一个

我正在使用 RabbitMQ 和 PHP-AMQP 进行一些耗时的操作。

我有一个将任务发送到队列的生产者-> 一个或多个工作人员监听该队列并执行耗时的操作-> 一个接收器,在工作人员完成时增加一个变量。

我使用了工人和接收者之间的交换。问题是当生产者发出日志时,我的接收器也会增加它的变量......

这是一张图片: 图表

我怎样才能简单地将这 2 个队列分开,以便我的接收者只知道来自工作人员(消费者)的消息?

0 投票
1 回答
596 浏览

php - Rabbit MQ 消费者如何工作?

我有 2 个关于 rabbitmq 消费者(接收者)的问题:

  1. 我如何定义(从队列中静态地)注册到某个队列的消费者是什么,以便如果一个消费者关闭,消息仍将在该消费者再次启动后传递,或者有任何其他方法可以实现这个?
  2. 消费者如何连接到尚未创建的队列,在rabbitmq教程中,我可以在生产者之前调用消费者并且它仍然可以工作,有人可以解释一下这是如何工作的吗?

谢谢

0 投票
2 回答
2507 浏览

rabbitmq - php-amqplib 库在命令提示符下工作,但不在浏览器上

当我使用命令提示符运行时,我有相同的代码。但是当我尝试使用浏览器运行它时,它会抛出以下错误。

我用过 php-amqplib。我的代码很简单,可以连接到 RabbitMQ 队列并将消息发送到队列中。凭据是正确的,因为我能够在命令提示符下运行相同的文件。

注意:iconv_strlen():在第 338 行的 /var/www/html/php-amqplib/vendor/symfony/polyfill-mbstring/Mbstring.php 中检测到输入字符串中的非法字符

注意:iconv_strlen():在第 338 行的 /var/www/html/php-amqplib/vendor/symfony/polyfill-mbstring/Mbstring.php 中检测到输入字符串中的非法字符

注意:iconv_strlen():在第 338 行的 /var/www/html/php-amqplib/vendor/symfony/polyfill-mbstring/Mbstring.php 中检测到输入字符串中的非法字符

致命错误:未捕获的 PhpAmqpLib\Exception\AMQPRuntimeException:读取数据时出错。在 /var/www/html/php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php:242 中收到而不是预期的 7 个字节堆栈跟踪:

0 /var/www/html/php-amqplib/PhpAmqpLib/Wire/AMQPReader.php(149): PhpAmqpLib\Wire\IO\StreamIO->read(7)

1 /var/www/html/php-amqplib/PhpAmqpLib/Wire/AMQPReader.php(106): PhpAmqpLib\Wire\AMQPReader->rawread(7)

2 /var/www/html/php-amqplib/PhpAmqpLib/Connection/AbstractConnection.php(508):

PhpAmqpLib\Wire\AMQPReader->读取(7)

3 /var/www/html/php-amqplib/PhpAmqpLib/Connection/AbstractConnection.php(555):

PhpAmqpLib\Connection\AbstractConnection->wait_frame(0)

4 /var/www/html/php-amqplib/PhpAmqpLib/Channel/AbstractChannel.php(217):

PhpAmqpLib\Connection\AbstractConnection->wait_channel(0, 0)

5 /var/www/html/php-amqplib/PhpAmqpLib/Channel/AbstractChannel.php(328):

PhpAmqpLib\Channel\AbstractChannel->next_frame(0)

6 /var/www/html/php-amqplib/PhpAmqpLib/Connection/AbstractConnection.php(205):

PhpAmqpLib\Channel\AbstractChannel->w in /var/www/html/php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php 242 行

0 投票
1 回答
624 浏览

php - 在 RabbitMQ 中解析或传递标头的 Json

我想将多值传递给 RabbitMQ 通过 PHP 提供的队列。这是一个有手机号码和内容的短信发送器。

将这两个参数作为json字符串发送到队列的有效负载并在消费者端解析json是否更好,或者,将手机号码作为标头参数发送,将内容作为有效负载发送,get("application_headers")getNativeData在消费者端使用手机号码?

哪种方式性能更好?

0 投票
1 回答
3022 浏览

rabbitmq - rabbitMQ 无法使用 php-amqplib 获得心跳

我观察到 RabbitMQ 被未确认的消息“卡住”。队列显示了一个不再存在的消费者,我假设正在发生的事情是 RabbitMQ 正在继续向该消费者传递消息。它们显示为越来越多的未确认消息。我正在使用 php-amqplib 在 PHP 中执行此操作。

我可以通过终止消费者进程(命令行上的 control-C)来产生问题。

我尝试指定 3 秒的心跳并尝试保持真假。有了心跳,消费者最终会失败:

问题 #374 可能相关:https ://github.com/php-amqplib/php-amqplib/issues/374

消费者正在从多个队列中消费,但我认为这无关紧要。

我试图解决的问题是,RabbitMQ 继续认为消费者存在,但实际上并不存在,结果 RabbitMQ 无法将这些消息传递到任何地方,并且它们未被确认。我正在寻找一种摆脱这种虚假连接的方法,以便可以将这些消息重新传递给实时消费者。我认为这就是心跳的用途,但我还没有让它发挥作用。

0 投票
1 回答
599 浏览

php - LaravelQueueRabbitMQ 插件在 StreamIO.php 上超时

我在 Laravel 5.1项目上设置 LaravelQueueRabbitMQ 插件时遇到问题。这是插件的存储库:

https://github.com/vladimir-yuldashev/laravel-queue-rabbitmq/tree/v5.1

我已经安装了包,将所需的服务提供者添加到 app.php 文件中,配置了 queue.php 文件并将相关条目添加到我的 .env 文件中以指向我的 RabbitMQ 服务器。

但是,当我尝试排队这样的工作时

我收到以下错误:

StreamIO.php 第 212 行中的 FatalErrorException:

超过 30 秒的最大执行时间

经过一些调试,问题出现在connect()方法中的 AbstractConnection.php 文件中。具体来说,第 205 行是脚本停止并导致最大执行时间的地方。

奇怪的是,我在同一台 PC 上运行了另一个 Laravel 项目,该 PC 运行在5.2版本上。它使用相同的 LaravelQueueRabbitMQ 插件,但使用的是 5.2 版本,而且效果很好 - 作业会立即出现在队列中。

我的想法不多了,我还没有看到其他人有类似的问题。谁能指出我正确的方向?

0 投票
1 回答
1121 浏览

docker - 在 Symfony 中执行 RabbitMQ 消费者时出现“读取数据错误”

我有一个 RabbitMQ 容器和一个带有 Symfony 3.1.x 项目的 PHP 7 容器,该项目使用OldSoundRabbitMqBundle执行 RabbitMQ 使用者。

运行执行test消费者的此命令时:

我收到以下错误:

[PhpAmqpLib\异常\AMQPIOException]

读取数据时出错。收到 0 而不是预期的 7 个字节

我的设置非常简单,我检查了以下内容:

  • RabbitMQ 是最新版本 (3.6.5)
  • 配置的host, vhost, user,password参数正确
  • mbstring扩展已启用

设置一个项目来重现问题真的很容易。

示例项目可在 GitHub 上找到,README 文件中提供了说明,只需几个步骤即可重现该问题。

以下是一些亮点:

码头工人-compose.yml

配置.yml

test_consumer服务是一个非常简单的实现ConsumerInterface接口的类。

有人对我的问题有任何想法吗?

0 投票
2 回答
444 浏览

php - 访问在绑定队列之前发送的交换消息

我有一个关于第三个 RabbitMQ 教程的问题。我正在尝试实现类似的东西,除了不能保证消费者在生产者向交易所发送消息时正在运行。

所以,我有我的生产者将消息发布到扇出交换:

在我的发布者中,我声明了队列,然后我将其绑定到交换:

这就是我的问题的根源。教程说:

如果没有队列绑定到交换器,消息将丢失,但这对我们来说没关系;如果没有消费者在监听,我们可以安全地丢弃消息。

有没有办法以某种方式保留这些消息,所以当消费者启动时,它会访问以前发送的消息?我想出如何做到这一点的唯一方法是在我的生产者和发布者中声明相同的队列,但这有点违背了为不同消费者提供交换和单独队列的目的。

0 投票
0 回答
181 浏览

wso2 - 将 wso2mb 消息代理服务器与 php 客户端一起使用

我试图将 php 客户端(使用php-amqplib lib)连接到基于 wso2mb(wso2 消息代理版本 3.1.0)的服务器。

我在使用 amqp_consumer.php 时无法成功,并且总是被这个错误锁定:

INFO {org.wso2.andes.server.protocol.AMQProtocolEngine} - 处理时无法创建 SASL 服务器:AMQPLAIN:[ConnectionStartOkBodyImpl: clientProperties={product=[LONG_STRING: AMQPLib], platform=[LONG_STRING: PHP], version=[ LONG_STRING:2.6],信息=[LONG_STRING:],版权=[LONG_STRING:],功能=[FIELD_TABLE:{authentication_failure_close=[BOOLEAN:true],publisher_confirms=[BOOLEAN:true],consumer_cancel_notify=[BOOLEAN:true],exchange_exchange_bindings =[BOOLEAN: true], basic.nack=[BOOLEAN: true], connection.blocked=[BOOLEAN: true]}]}, 机制=AMQPLAIN, response=[5, 76, 79, 71, 73, 78, 83 , 0, 0, 0, 5, 97, 100, 109, 105, 110, 8, 80, 65, 83, 83, 87, 79, 82, 68, 83, 0, 0, 0, 5, 97, 100 , 109, 105, 110], locale=en_US] [2016-11-04 08:05:26,901] 信息 {org.wso2.andes.server.protocol.AMQProtocolEngine} - 关闭连接由于:org.wso2.andes.AMQConnectionException:无法创建 SASL 服务器:AMQPLAIN [错误代码 506:资源错误]

我在confing.php中使用thos参数作为conexions参数

我的问题: 1. 你能推荐任何 php 库/教程来建立一些 php 代码和 wso2mb 之间的通信吗?2. wso2mb 允许的连接方式有哪些?(PLAIN,AMQPLAIN ...?) 3.请帮助 :)

0 投票
1 回答
4097 浏览

php - RabbitMQ中$channel->wait()是什么意思

我是 RabbitMQ 的新手。我正在使用带有 codeigniter 的 php-amqplib 库,并且仍然想知道我缺乏的一些知识。

  • 为什么$channel->wait()使用?
  • 为什么它总是驻留在一个无限的while循环中?
  • 如何/我可以绕过 Infinite while 循环。

就像在我的项目的一个用户想要向 100k 潜在客户广播新活动的情况下,如果第二个用户有大约 100 封邮件要发送,第二个用户就会受到影响,第二个用户必须等待 100k 邮件先送达,然后是最后一个用户轮到他了。

我需要一个并发消费者的解决方案,他们工作顺利而不影响其他人

这是我的代码片段:

如果有人能指导我完成整个过程,我将不胜感激。