我正在编写一个简单的应用程序,就其使用而言,它与聊天应用程序非常相似。主持人启动“房间”,参与者可以加入并向所述房间发送消息。
我想尽可能简化代码。 PHP在后端没有任何花哨的东西。
我的第一个想法就是从客户那里查看ajax,看看房间里是否有新消息。然后我认为这会导致对服务器的大量请求(授予它们很小,但仍然如此)。
然后我研究了更多的HTML5方法,并找到了EventSource - 这在理论上似乎是正确的,但我不知道它是否已被覆盖,无论如何都只是调查了ajax。
然后是彗星,但它也需要一个我不太急于设置的服务器端组件。
我想我可以使用长轮询 - 这是最好的方法吗?
另外,如何最小化所有要求新数据的客户端的数据库请求?
答案 0 :(得分:4)
我认为短轮询是最简单的编码,但它可能会在服务器上造成不必要的负载。
长轮询更有效,但您必须拥有能够有效支持多个连接(即不是Apache)的服务器。
是的,EventSource只是一个美化的长期民意调查,但与之合作很愉快。
回答第二个问题:最小化数据库请求数量的最佳方法是不进行数据库请求。例如,将内容放入memcached中。
答案 1 :(得分:1)
Sergio为EventSource问题提供了一个很好的答案。他还声明Apache不会扩展以处理许多同时/并发连接。 Apache上的PHP存在这个问题 - 特别是如果您使用共享主机。
PHP的最佳解决方案是将实时Web通信和消息分发外包。您可以使用self hosted realtime web solution ...
自行完成此操作然后是彗星,但它也需要一个我不太急于设置的服务器端组件。
但听起来你不想热衷于此。因此,您最好的选择是托管的实时Web解决方案,例如Pusher(我工作的人)使用WebSockets。通过使用此类服务,您可以按如下方式实施聊天应用:
chat-channel
。该名称可以特定于会话主题,例如chat-fishing
(有关频道here的更多信息)new_message
频道上触发chat-channel
事件,将该消息分发(广播)到同一聊天室内的每个用户。这是通过托管服务RESTful API使用PHP library完成的(它包含了RESTful API所需的任何身份验证等功能)。tech example in this presentation应该证明了消息分发的好处。
有一个关于how to build a chat application using PHP with Pusher on Nettuts+的好教程。
虽然此解决方案/答案非常以Pusher为中心,但概念(外包收益,订阅,渠道和事件)适用于支持实时客户端推送的所有realtime hosted services。