如何使用PHP+;JS+;(MySQL?+;(阿贾克斯?)

如何使用PHP+;JS+;(MySQL?+;(阿贾克斯?),php,javascript,ajax,chat,performance,Php,Javascript,Ajax,Chat,Performance,用js编写在线聊天的最佳方式是什么?如果我使用AJAX,每5秒更新一次关于用户和消息的信息,HTTP请求和应答将产生巨大的流量,请求将产生较高的服务器负载 但又如何呢?插座?但是如何…有几种方法可以立即将消息发送给客户端: HTML5WebSocket 很好,因为你可以像真正的插座一样使用它们 不好,因为只有少数浏览器支持它 无限加载帧 很好,因为每个浏览器都支持它 不是很酷,因为您必须执行AJAX请求来发送内容 您可以通过在内容中嵌入标记向客户端发送命令 脚本也会立即执行 总

用js编写在线聊天的最佳方式是什么?如果我使用AJAX,每5秒更新一次关于用户和消息的信息,HTTP请求和应答将产生巨大的流量,请求将产生较高的服务器负载


但又如何呢?插座?但是如何…

有几种方法可以立即将消息发送给客户端:

  • HTML5WebSocket
    • 很好,因为你可以像真正的插座一样使用它们
    • 不好,因为只有少数浏览器支持它
  • 无限加载帧
    • 很好,因为每个浏览器都支持它
    • 不是很酷,因为您必须执行AJAX请求来发送内容
    • 您可以通过在内容中嵌入
      标记向客户端发送命令
      • 脚本也会立即执行

总之,我会选择第二种方法。

典型的方法是使用。虽然最好不要在PHP中这样做(PHP需要为每个连接使用一个进程,从而极大地限制了站点的可能访问者数量)。而是使用。它非常适合聊天。

您的服务器负载似乎有问题,因此我将比较相关技术

Ajax轮询: 这是最直接的。您每隔5秒左右设置Timeout loop以检查新的聊天信息,或者设置iframe以重新加载。当你发布一条消息时,你也会返回新的消息,事情不应该出问题。这种方法的最大缺点是,您不太可能以与消息发布频率相对应的频率进行轮询。要么你投票太快,你会提出很多额外的请求,要么你投票太慢,你会一次收到大量的消息,而不是以实时的方式。不过,这是迄今为止最简单的方法

HTTP推送 这就是服务器应该在有新消息时告诉客户端的想法,而不是客户端不断地打扰服务器询问是否有新消息。想象一下,当父母开车时,孩子问“我们到了吗?”,你可以让父母告诉孩子他们到了那里

有两种方法既可以假装也可以真的这么做。您提到的WebSocket实际上是在客户端和服务器之间创建流,并实时发送数据。这真是太棒了,对于10个拥有浏览器的用户中的4个来说,他们会非常兴奋。其他人都会有一个坏页。很抱歉也许几年后吧

您还可以通过长轮询之类的方式伪造推送技术。其思想是,您询问服务器是否有任何新消息,服务器在出现新消息或达到某个预设限制(30秒左右)之前不会应答。在使用已知的web技术的同时,这将请求数量保持在最小,因此大多数浏览器都可以使用它。您将有一个高连接并发性,但他们实际上什么也没做,所以服务器成本应该太高了


我以前使用过所有这些方法,但最终我自己使用了长轮询。您可以在这里找到更多关于如何实际执行此操作的信息:

您应该选择套接字而不是AJAX轮询,但是关于如何将基于套接字的聊天与MySQL集成,目前还没有太多相关的内容

我做了一些测试,这里有一个基本示例:

它使用Ratchet()在PHP中创建聊天服务器


您可以通过发送包含聊天对象信息的服务器JSON向DB发送聊天消息(当然,如果您有用户会话)

不确定什么是AJAX,但在其他框架内使用常规格式向服务器发送消息并不难。您可以使用WebSocket的Flash回退功能来获得更大的兼容性。见例句。2015年,WebSocket得到了除ie8和ie9之外的一切有效支持:D