收到新消息时刷新聊天框

Refresh chat box when new msg received

我是 PHP 的新手。我将使用聊天框 PHP 制作一个简单的 Web 应用程序。

我不知道有什么更好的方法可以在收到新消息后立即刷新聊天 window。我唯一想到的就是经常刷新页面。我知道这不是个好主意。

我知道如何使用AJAX,所以我只能刷新聊天框(而不刷新整个页面)。但在 AJAX 中,客户端也必须发送请求。

有没有办法在收到新消息时通过服务器刷新聊天框?

是的,有一种方法可以通过服务器通知客户端。叫做

WebSocket

使用这项技术,您可以随时将数据从服务器发送到客户端,反之亦然。 它创建一个 TCP 连接并保持打开状态,直到您手动关闭它。

我以前没有在 php 中使用过它,但是 google 快速搜索给了我一些库的结果,所以你应该找到一个合适的解决方案。不过,我认为 node.js 服务器,在其他连续 运行 服务器上,更适合此功能。

在客户端,您可以通过 JavaScript 中的 WebSocket 进行通信。
先打开连接

var webSocket = new WebSocket("ws://www.example.com/socketserver");

然后您可以等待传入流量并在函数中处理数据

webSocket.onmessage = function (event) {
    console.log(event.data);
}

这只是一个非常简短的概述。您会找到很多关于此主题的信息,例如 Mozilla Developer Network

Web 应用程序中的标准通信顺序是 HTTP 请求由 Web 客户端(浏览器)发起,然后由服务器响应。

您需要的是角色互换,服务器计算机请求客户端计算机接收消息。

这叫做server push。链接的维基百科文章列出了很多解决方法。

客户端反复询问服务器是否有新消息到达是最简单的方法,称为轮询,但频率高会给服务器带来压力(如果多个客户端这样做会成倍增加)并且频率低对于许多用例,频率响应不够快。

尽管其他用户 emsch 使用大字体,但 WebSockets 并非对每个人都可行(目前),因为并非每个浏览器都支持它。 比较您的 browser/os 矩阵,例如browser implementation.

几年前我最喜欢的是 BOSH, which I preferred to other methods like Comet:BOSH 需要服务器保持一个连接才能响应,并且可能需要与服务器建立第二个连接才能响应客户端。由于可能会发生超时,空交换会在一段时间后以较低的频率执行。因此,如果没有消息到达服务器或客户端,BOSH 的行为类似于慢速轮询。

如果您不熟悉 Web 和网络开发,我建议您寻找一个不错的消息传递库。

  • 如果您需要支持较旧的浏览器,请使用支持上述几种技术并回退到最佳适用情况的库
  • 如果您可以使用现代浏览器,请使用一些基于 WebSockets 的库。