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 可以为您提供什么。
我喜欢编写一个 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 可以为您提供什么。