我喜欢编写一个PHP脚本,它将在Linux上运行。
我试图找出在PHP守护程序(脚本)和浏览器客户端之间发送和接收元数据的解决方案是什么?
我认为我可以在守护程序本身中包含http请求处理,但守护程序脚本每秒可以接收500-1000个请求。所以守护进程本身的http请求不是一个好的解决方案。
Redis或ZeroMQ是解决方案吗?像这样:
(browser clients) <-----> redis <-----> PHP Daemon Script
如果PHP守护程序向客户端发送消息,则浏览器应立即通过ajax(长轮询)获取元数据。
答案 0 :(得分:2)
如果您希望浏览器通过长时间轮询实时获得反馈......我不认为Redis是一种选择。据我所知,Redis不允许长轮询查询...如果查询时该值不存在...它将返回null。
我的建议是使用像websockets这样的东西。 PHP有一些使用websockets的库,我熟悉的是http://socketo.me/。但是,这意味着客户端将直接与您的PHP脚本进行交互。您可以通过在其前面添加负载均衡器并在不同的端口/盒子上安装多个守护进程来扩展它。
如果您不必使用PHP,我宁愿建议像NodeJS这样的东西。它做了这样的事情,默认情况下,Ratchet PHP试图模仿它。
答案 1 :(得分:1)
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可以为您提供的内容。