PHP 守护进程 - 从浏览器接收命令?

PHP Daemon - Receive commands from Browser?

我喜欢编写一个 PHP 脚本,它将 运行 在 Linux 的后台运行。

我想弄清楚在 PHP 守护程序(脚本)和浏览器客户端之间发送和接收元数据的解决方案是什么?

我想我可以在守护程序本身中包含 http 请求处理,但是守护程序脚本每秒可以接收 500-1000 个请求。所以守护进程本身的 http 请求不是一个好的解决方案。

Redis 或 ZeroMQ 可以解决这个问题吗?像这样:

(browser clients) <-----> redis <-----> PHP Daemon Script

如果 PHP 守护进程向客户端发送消息,那么浏览器应立即通过 ajax(长轮询)获取元数据。

如果您希望浏览器通过长轮询实时获得反馈...我认为 Redis 不是一个选项。据我所知,Redis 不允许长轮询查询...如果查询时该值不存在...它将 return 为空。

我的建议是使用类似 websockets 的东西。 PHP 有几个与 websockets 一起工作的库,我熟悉的一个是 http://socketo.me/。但是,这意味着客户端将直接与您的 PHP 脚本交互。您可以通过在它前面添加一个负载平衡器并在不同 ports/boxes 等

上有多个守护进程来扩展它

如果您不必使用 PHP,我宁愿建议使用 NodeJS 之类的东西。它是用来做这样的事情的,默认情况下它会做 Ratchet PHP 试图模仿的事情。

Chris Brand 给了你答案,websockets。我只想更详细地介绍一下您的问题,以帮助指出您的一些误解。

从浏览器建立非 http 连接的唯一有效方法是 websockets - 它是浏览器与外部服务器通信的唯一接口,不包括完整的 http 开销。

您的图表:

(browser clients) <-----> redis <-----> PHP Daemon Script

... 好像把redis当成了一个通信协议,其实不是,它是一个数据存储。您不会使用 Redis 将通信从浏览器传递到 PHP 脚本,就像您使用 MySQL 完成相同任务一样。不管怎样,乍一看 Redis 似乎无法直接接收 websocket 连接,因此您无论如何都无法将浏览器直接连接到它,因此图片看起来更像是:

(browser clients) <-----> PHP Daemon Script <-----> redis (or any other data store)

如果您愿意,您可以使用 ZMQ 来管理您的通信,这样做可能有令人信服的理由,但这是特定于应用程序的。无论如何,ZMQ 将 置于 websockets 之上,并为此添加自己品牌的开销。也就是说,它专为此类高容量消息传递而设计。

我的建议是考虑直接使用 websockets 与后端通信。 Chris Brand 提出了另一个很好的建议来考虑使用 node.js,但是学习曲线(如果您熟悉 JS,则相对较小)对于您的项目的这次迭代可能不值得。如果您 运行 关注 messaging/connection 可靠性问题,那么您可能会研究 ZMQ 可以为您提供什么。