我正在编写一个简单的应用程序,在使用方面与聊天应用程序非常相似。主持人启动一个"房间",参与者可以加入并向该房间发送消息。
我正在努力使它尽可能简单地编码。PHP在后端没有任何花哨的东西。
我的第一个想法是从客户那里轮询ajax,看看房间里是否发布了新消息。然后我想这会导致对服务器的大量请求(当然它们很小,但仍然如此)。
然后我研究了更多的HTML5方法,发现了EventSource——这在理论上似乎是正确的,但我想知道它在背后只是对ajax进行了民意调查。
还有comet,但它也需要一个服务器端组件,我并不急于设置它。
我想我可以使用长轮询——这是最好的方法吗?
此外,如何最大限度地减少来自所有请求新数据的客户端的数据库请求?
我认为短轮询是最简单的代码,但它可能会在服务器上产生不必要的负载。
长轮询更高效,但必须有一个能够有效支持多个连接的服务器(也就是说,不是Apache)。
是的,EventSource只是一个荣耀的长期民意调查,但与之合作很愉快。
回答您的第二个问题:尽量减少数据库请求数量的最佳方法是不进行数据库请求。例如,将内容放入memcached中。
Sergio为EventSource问题提供了一个很好的答案。他还指出,Apache不会扩展到处理许多同时/并发连接。Apache上的PHP有这个问题,尤其是在使用共享托管的情况下。
PHP的最佳解决方案是将实时web通信和消息分发外包。您可以通过使用自托管实时web解决方案自行完成此操作。。。
还有comet,但它也需要一个服务器端组件,我并不急于设置它。
但这听起来像是你不热衷于设置。因此,您最好的选择是使用WebSockets的托管实时web解决方案,如Pusher(我为其工作)。通过使用这样的服务,你可以实现你的聊天应用程序如下:
- 当用户加入房间时,他们订阅了
chat-channel
。该名称可以特定于会话主题,例如chat-fishing
(有关频道的更多信息,请点击此处) - 当用户提交聊天消息时,服务器会收到该消息(可能是通过AJAX请求)
- 您将使用此新消息更新数据库
- 一旦数据库成功更新,您就可以通过触发
chat-channel
频道上的new_message
事件,将该消息分发(广播)给同一聊天室中的每个用户。这是通过托管服务RESTful API使用PHP库完成的(该库包含RESTful API所需的任何功能,如身份验证) - 该消息由连接的客户端接收
本演示文稿中的技术示例应展示我们采购消息分发的好处。
关于如何在Nettuts+上使用Pusher使用PHP构建聊天应用程序,有一个很好的教程。
尽管此解决方案/答案非常以Pusher为中心,但这些概念(外包好处、订阅、渠道和事件)适用于所有支持实时客户端推送的实时托管服务。