【问题标题】:RabbitMQ PHP Consumer Database ConnectionRabbitMQ PHP 消费者数据库连接
【发布时间】:2015-10-26 17:52:57
【问题描述】:

我正在考虑在我的新应用中使用 RabbitMQ 进行一些异步处理。

我面临的挑战之一是如何最好地处理数据库连接。我将使用 Eloquent 和有效的 PDO。

我在网上找到的一个资源https://www.teqneers.de/2013/10/simple-spawn-rabbitmq-consumers-with-php/ 建议使用proc_open 生成一个新进程,但我对这种方法不太满意,想知道是否有更好的方法。

我还尝试寻找在 PHP 守护程序中处理数据库连接的最佳实践,但没有找到任何东西。

我想到的一些事情。

  1. 为每条消息创建一个新连接并关闭它

    • 缺点:应用程序是关于向批量消息传递消息的,消费者会很多并且经常运行。可能资源很重。
    • 优点:但是,传统的 php 脚本以类似的方式工作,所以这可能不是一个坏主意
  2. 在消费者的整个生命周期中保持连接并经常杀死他们

    • 缺点:显然是浪费。需要不断检查连接是否仍处于活动状态。
  3. 在命令行上运行工作器

    • 缺点:移动部件太多。需要解析消息 ACKS 的响应,因此消费者需要等待工作人员结束。意味着创建和关闭每条消息的连接,最好坚持使用选项 1,因为它的部分更少。

我也想到了持久连接,但在阅读了更多关于它们的信息后,似乎它们并不是我想象的那样。此外,许多帖子都说这不是一个好主意。

我知道 PHP 可能不是最适合这方面的工作,但我正在快速进行原型设计,而 PHP 是我最适合这项任务的语言。

如果我能就如何处理这个问题获得一些建议,我将不胜感激。

谢谢。

【问题讨论】:

    标签: php database rabbitmq database-connection daemon


    【解决方案1】:

    所以我决定采用一个合并 proc_open(实际上不使用 proc_open)和选项 1 和 2 的解决方案。

    使用https://github.com/ricbra/rabbitmq-cli-consumer,此cli 工具处理消息的实际消耗并通过命令行将其传递给PHP 脚本(用作代理)。

    PHP 脚本每条消息运行一次,并根据退出代码返回(0:成功,1:失败),消息 ACK 被处理。

    该脚本在 CLI 上像普通 PHP 脚本一样运行,因此您可以对资源处理保持理智。这里没有守护进程。

    【讨论】:

    • 我目前正在努力解决同样的问题。感谢您分享上面的链接,这似乎是完成这项任务的好方法。在此期间您是否找到了一些更好的建议,或者您是否坚持这种方法? @frostymarvelous
    • 我坚持这一点。我现在主要在做 dot net,所以我不需要重新访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多