EventSource与polled ajax的效率/开销?

时间:2012-01-09 05:06:34

标签: php javascript ajax comet polling

我正在编写一个简单的应用程序,就其使用而言,它与聊天应用程序非常相似。主持人启动“房间”,参与者可以加入并向所述房间发送消息。

我想尽可能简化代码。 PHP在后端没有任何花哨的东西。

我的第一个想法就是从客户那里查看ajax,看看房间里是否有新消息。然后我认为这会导致对服务器的大量请求(授予它们很小,但仍然如此)。

然后我研究了更多的HTML5方法,并找到了EventSource - 这在理论上似乎是正确的,但我不知道它是否已被覆盖,无论如何都只是调查了ajax。

然后是彗星,但它也需要一个我不太急于设置的服务器端组件。

我想我可以使用长轮询 - 这是最好的方法吗?

另外,如何最小化所有要求新数据的客户端的数据库请求?

2 个答案:

答案 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的更多信息)
  • 当用户提交聊天消息时,您的服务器将收到该消息(可能通过AJAX请求)
  • 您将使用此新消息更新数据库
  • 数据库成功更新后,您可以通过在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