Redis在PHP中的发布/订阅功能是否实用?

5
我想在PHP中使用redis pub/sub,但我担心PHP不能是唯一的工具:订阅者需要始终可调用,因为php不适用于作为守护程序运行,我不能相信它能可靠地始终处于“开启”状态。
那么PHP世界的解决方案是什么?
  1. 不要使用pub/sub,使用其他redis存储,并使用crontask每隔x分钟启动php
  2. 使用一个代理来调用php?
  3. 其他?
“2.”的意思是:使用一个nodejs/java/fooBar服务器作为守护进程的订阅者,并通过http/cli或其他方式回调php。
我找不到比“2.”更好的主意,但它似乎同样低效...
你的意见是什么?
编辑:: 如果使用像platform.sh这样的云平台,该如何实现此功能,因为它不提供类似supervisor.d的机会?

1
只需运行PHP守护进程即可正常工作。Laravel支持Redis发布/订阅。 - Mike Miller
1
我不熟悉 PHP 技术,但我认为有一些方法可以将 PHP 代码转化为守护进程。 - Sergio Tulentsev
@MikeMiller,它工作得好吗?它是长期稳定的,还是你必须像重新启动守护程序一样每隔一段时间进行解决方案? 我担心它会成为执行任务的不良工具:PHP被构建为短生命周期脚本语言,我知道它在交叉引用数组等方面存在内存泄漏问题。 - Bruno
1
@bruno,如果脚本出错,你需要使用supervisor.d或类似的工具来保持其运行。你可能应该查看一些PHP CLI库,比如http://symfony.com/doc/current/components/console.html。我的稳定项目已经运行了几年,没有任何问题。 - Mike Miller
1
@bruno 你可以这样做。在切换到Symfony组件之前,我使用无限循环和一秒钟的休眠来运行它们,以便它不会变得太疯狂。不确定Symfony正在做什么,但我认为它是相同的。唯一需要记住的是,如果你选择这种方式,在代码更改后需要重新启动,否则它将继续运行旧代码。 - Mike Miller
显示剩余4条评论
1个回答

1

感谢评论,我找到了一个令人满意的方法:使用supervisor.d,它将使用以下方式重新启动symfony命令脚本:

  • set_time_limit(0)
  • 一个无限循环
  • 与redis的阻塞调用(带有1秒以下的最大读写超时时间的BRPOP
    • 重要的是执行一个阻塞命令,以便不消耗所有的CPU时间
    • 我甚至可以转向真正的发布/订阅,但现在我只有一个监听器,所以这并不重要

从早期的角度看,我能说的是:

  • supervisor.d 很容易安装/配置,文档很全面,我没有遇到任何问题,这非常罕见+令人满意!
  • 看起来它运行良好
  • 日志已写入,因此将来的崩溃可能更容易理解
  • 在连续且接近的 X 次崩溃的情况下,服务会停止,我没有找到一种被通知的方式,这真的是个问题,我想我会去 this solution(doc)
  • 像 @Mike Miller 说的:“如果你走这条路,唯一需要记住的事情是在代码更改后需要重新启动,否则它将继续运行旧代码

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接