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不允许长轮询查询…如果在查询时该值不存在…它将返回null。

我的建议是使用websockets之类的东西。PHP有几个与websockets一起工作的库,我熟悉的一个是http://socketo.me/。然而,这意味着客户端将直接与PHP脚本交互。你可以通过在它前面添加一个负载平衡器,并在不同的端口/机器等上拥有多个守护进程来扩展它。

如果你不需要使用PHP,我建议你使用NodeJS。它的功能是这样的默认情况下它会模仿棘齿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的话相对较小)对于你的项目的这个迭代来说可能不值得。如果您遇到消息传递/连接可靠性的问题,那么您可以查看ZMQ可以提供什么。

相关文章: