异步聊天

时间:2013-09-14 22:47:24

标签: php mysql ajax

我正在关注PHP-MySQL shoutbox教程,该教程仅涵盖在数据库中发送和存储消息。完成之后,我暂时选择每隔5秒刷新一次消息列表,或者每次使用AJAX发送新消息时刷新消息列表。但是在现实生活中,这将是效率太低和服务器消耗(实际上是低强度DDOS)。那么如何在必要时刷新新邮件列表?更确切地说,如何在发生这种情况时通知我发送了一条新消息,以便我可以显示它?

4 个答案:

答案 0 :(得分:6)

您的问题的解决方案称为长轮询,您可以在this SO question中找到更多信息。

我们的想法是使用当前的AJAX加载信息,但如果没有任何内容可以返回,服务器将不会立即返回响应。相反,它只会在返回空响应之前保持连接打开预定义的秒数,或者在消息可用时立即返回。最大响应时间应该足够长,以使其值得,但不要太长,以免在客户端出现超时 - 大约20秒左右应该没问题。

虽然此解决方案允许您减少对服务器的HTTP调用次数,但它只是改变了问题:PHP脚本在等待消息可用时仍需要轮询数据库。如果你期望中等流量,你会没事的。但是如果你想要能够认真地扩展,你将不得不寻找另一种解决方案。

最佳解决方案是使用正确的消息队列而不是数据库,例如Amazon SQSIronMQ

这些将无限制地扩展,并将提供诸如长轮询之类的功能(不确定IronMQ,但SQS肯定会这样做。)

答案 1 :(得分:2)

从服务器端事件获取通知称为推送技术。通常,这些实现利用了websockets来避免轮询的压力。

Ratchet是一种常用的PHP WebSocket实现,允许使用推送技术将数据发送到客户端。这将允许发送推送通知,而无需轮询或消除服务器或连接池。

答案 2 :(得分:1)

我强烈建议您检查Socket.IO project是否为客户端,这是一个出色的实时通信库,可根据访问者浏览器处理所有协议和解决方案。这也将解决您的服务器端问题。

  

Socket.IO旨在在每个浏览器和移动设备中实现实时应用程序,模糊不同传输机制之间的差异。它在JavaScript中实现100%的免费实时。

  1. 的WebSocket
  2. Adobe®Flash®Socket
  3. AJAX长轮询
  4. AJAX multipart streaming
  5. 永远的iframe
  6. JSONP民意调查

答案 3 :(得分:-1)

服务器无法通知Web浏览器。 HTTP是基于拉的系统。 AJAX的全部目的是伪造成基于推送的系统。如果你需要推送,你需要AJAX。