问题标签 [php-amqp]

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 回答
889 浏览

php - 兔子 amqp 连接耗时过长

我有很奇怪的事情。连接到我的兔子服务器需要 0.6 - 3 秒...

AMQPConnection::connect() 工作很长时间。在我的开发和舞台机器上一切都很好,但是在稍微高负载的生产中(发布〜10条消息\秒)我遇到了连接时间问题......

我如何以及在哪里可以开始我的研究?

非常感谢。

0 投票
3 回答
6027 浏览

rabbitmq - 是否可以在 amqp 中获取未路由的消息?

使用 RabbitMQ Web UI,当我发布到没有当前队列绑定的主题交换时,rabbitmq 表示消息已发布但未路由。

使用 amqp.node,当我将队列绑定到交换机并使用“#”(全部)开始消费时,我什么也得不到。

我期待收到以前发布但未路由的消息。这可能吗?

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 投票
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 回答
702 浏览

php - 未定义符号:第 0 行未知中的 amqp_ssl_socket_set_verify_peer

刚刚将 PHP 更新到 5.6.30,每个 PHP 请求都会产生一个警告

软件包php-pecl-amqp-1.8.0-1.el6.remi.5.6.x86_64已安装并且是最新版本。

我使用 CentOS 版本 6.7 (Final)

0 投票
1 回答
1833 浏览

php - rabbitmq and php - Process multiple queues with one worker (broker)

I have 1000 queues with specific names. so I want to process these queues with one broker. is it possible?

the queue names is stored in mysql db so I should fetch theme and run the broker for each one. and of course it should run asynchronously and should be able to pass the queued item to a idle broker. is this possible? or I should make 1000 files with specific queue names as brokers?

Update: this is a picture of my queues. the queues should run in a parallel manner not a serial one. so the users are producer and the worker is consumer that runs the send_message() method;

enter image description here

0 投票
1 回答
2038 浏览

php - 消费者 basic_cancel 后的 RabbitMq 未确认消息

好的,无需详细介绍我设置的整个系统,

我遇到的问题是,当消费者取消(AMQPChannel->basic_cancel)侦听队列时,它会留下一条该工作人员未确认的附加消息。它也不会触发正常的回调来处理此消息。

一些细节

  • 队列阻塞(使用等待) while(count($channel->callbacks)) { $channel->wait( ... ) ... }
  • 预取是 1,你可以拥有的最小
  • 消费者可以动态收听 ( AMQPChannel->basic_consume)
  • 消费者可以动态忘记 ( AMQPChannel->basic_cancel)

我不会详细说明我告诉给定消费者消费或取消给定队列的确切方式。但这一切都完美地开始消费或取消就好了。但是,当我取消一个仍然有消息的队列时,他们只是忘记了最后一条消息,并且我相信取消会删除该队列的回调,因此除了杀死不希望的消费者之外,没有办法恢复该消息。

我做了一些调试(只是一个例子,不是我实际做的)

这个的输出大致是

一旦工人死亡(或者我宁愿杀死它),消息就会被放回队列中,我可以在获取消息下的 RabbitMq 管理事物(插件)中将其拉出。它就在那里,

"correlation_id":32,"max_correlation_id":38对应于,因为correlation_id: 32:38我需要跟踪消息部分。所以我知道这是同样的信息。

那么为什么在我取消之后我会收到最后一条卡在僵尸领域的消息,并且无论如何都要将它踢回队列而不杀死消费者。

此外,这不是一次性的,每次我取消其中仍有消息的队列时都会发生这种情况。所以它与给定的消息无关。就好像它得到了最后一条预取消息,然后因为它被取消了,所以最后一条消息没有回调来运行,它只是陷入了困境。请记住 0 预取是获取所有消息,1 是您可以设置的最低值。

任何可以提供的帮助都会很棒。

更新

我可能会打电话给我一个解决方案

无论是之前还是之后basic_cancel

这会拒绝该消息,我什至可以$this->getAmqpChannel()->getMethodQueue()如上所示进行测试,以查看$queue我正在取消的消息是否被封存(尚未实现)。

我试图避免使用recover,但我认为这应该没问题,因为消费者使用单个通道并且正在阻塞,最坏的情况是它只会拒绝有效消息 1 次,虽然不理想应该是可以接受的。

然而,在某些情况下,我从兔子那里得到了一个额外的例外,

如果有人对这个额外的错误有任何详细信息,那就太好了。此外,所有队列都需要 Ack,它们都不是自动的。

更新1

我在堆栈跟踪中注意到,queue_unbind所以我所做的是在内部跟踪绑定,这样我可以确保取消绑定只完成一次。明天做更多测试后,我将发布一些代码,但我在实施后的初始测试不再产生错误。

所有这些听起来可能有点“奇怪”,我可以解释为什么以及我在做什么,但这可能超出了问题的范围。我会说我已经在生产中使用了这个系统超过 2 年(我设计了它),我们每分钟可以进行 18 万次搜索(如果考虑系统的所有部分,大约 100 次)。我们还使用它进行了超过 2800 亿次搜索,感觉是我构建的。我们现在也是我们行业中的领先公司,要么淘汰了我们的竞争对手,要么他们把他们的东西寄给我们,不再在内部做。这在很大程度上是因为我们的快速周转以及我们的数据质量。所以这个系统确实有效,而且效果很好。

但在最近的审计中,我注意到 Daily 消费者只需处理大约 1000 万行(大约 100 分钟的工作),而 Nightly 消费者只需处理大约 1 亿行(或大约 20 小时的工作)。Daily 消费者可以在夜间工作,但只能在工作时间之外(因为它减少了白天的响应时间),因此有大约 10 小时的窗口,夜间工作只能在更小、功能更差的服务器上运行。这给我们的解决方案是,如果没有每日作业(客户提交的作业),它们可以动态地动态交换到夜间工作(数据仓库)。这应该保持大部分响应能力,同时在没有提交作业时不会浪费资源。我们可以在搜索中随心所欲地横向扩展,但我们确实为我们的主服务器付出了很多,

我可能会写一本小书来说明这一切是如何工作的,但希望这能给我一些关于我在做什么的基本概念。我还受到合同中一些保密和非竞争条款的约束,因此我可以真正了解具体细节。

0 投票
1 回答
368 浏览

php - 如何在 CircleCI config.yml 中添加 php-amqp?

我尝试在我的 config.yml 中添加以下命令:

docker-php-ext-安装 amqp

但 CircleCI 说:

错误:/usr/src/php/ext/amqp 不存在

这是我的完整 config.yml 文件:

0 投票
0 回答
64 浏览

php - php-amqplib:如何防止无限加载网页?

我使用云服务来处理 RabbitMQ。目的是从使用 MQTT 的智能对象发送和接收消息。一切正常,但是... 提交时的 formPage.php 会触发执行 initRpc.php 的 shellexec 命令。 在 initRpc.php 中,这个无限循环用于接收消息,但即使之前已声明,也会阻塞所有其他函数,例如 header('location ...');

结果是提交时的 formPage.php 保持在同一页面上,永远加载。如何预防这个问题?

但是我仍然可以通过手动点击链接浏览网站并提出其他请求..所以接收器在后台运行没有问题。

0 投票
1 回答
42 浏览

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

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

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

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

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

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