如何使用 XAJAX 和 PHP 编写实时聊天?
换句话说,有没有办法将 xajax 响应从服务器发送到多个客户端?或者是在客户端每隔几秒钟检查一次新消息的唯一可能性吗?
不可以。客户端必须反复“轮询”服务器。
我认为这里的关键是考虑交互设计。诀窍是欺骗用户认为聊天是即时的,但实际上它每 1 或 2 或 3 或 10 秒更新一次。
想法:
1)当用户发送消息时,直接在聊天中显示并触发投票。
2) 如果投票返回来自其他用户的多条消息,不要一次全部添加,实际上是在 1-2 秒左右的时间段内添加它们,随机间隔,使其看起来像是进来的“立即”和独立。(如果有一堆消息同时出现,用户很快就会意识到聊天是在那里更新的,而不是连续更新的。)
3) 如果用户空闲 x 时间。将轮询率降低到每 10 秒左右一次。
4) 如果用户处于活动状态,即发送大量消息,则更频繁地轮询。
5) 为您写入聊天上次更新时间的每个频道都有一个静态文件。例如文件具有您喜欢chat-teenfun-lastupdate.txt
的内容或任何时间格式。1224934239
静态地提供这个文件并让客户端轮询这个文件以检查通道是否已更新,而不是调用chat-poll.php?ch=teenfun
它进行动态检查。静态文件的服务速度大约快 10-100 倍,具体取决于动态脚本所涉及的工作,当您获得 250 多个用户轮询时,您将需要它。
祝好运并玩得开心点!
/0
PS。或者,您实际上可以让客户端对服务器进行 ajax 调用并让它们“挂起”。那就是你接受他们的请求并假装开始发回数据,但你只是暂停。当发生某些事情时,您会使用适当的数据完成响应。为此,我相信您需要编写自己的 HTTP 服务器,具体来说就是这样做,因为您不能在内存中挂起 250 个 php 进程。也许 Lighttpd 可以以某种方式与该 LUA 缓存模块一起使用。我不知道。不过会很有趣。见鬼,我得找个时间试试:)
当然有,但我认为它对许多用户来说不会很有效。您可以进行轮询,每个客户端轮询服务器以查看是否有任何新消息,或者您可以使用彗星技术,服务器可以将新消息推送到客户端 - 查看XAJAX 的 Comet 插件。如何使用 XAJAX 和 PHP 实现这一点超出了我的范围,但这是我尝试实现它的方式。
让每个客户端连接到服务器(登录等),然后:
使用像 ejabberd 这样的真正 IM 服务器可以走很长一段路,效率更高,并允许您的用户通过桌面客户端进行连接(如果这是您想要的)。我可能会将其用作后端,IOW ejabberd 将是服务器,PHP 将是在 PHP 中使用 XMPP的客户端,并充当 webgui 的代理。
另请参阅:
关于 Gmail 聊天功能(和可扩展性问题)的 Google Techtalk
那是我的 0.02 美元
只要没有 HTTP 推送技术,您将永远无法仅使用JavaScript
.
可能的解决方法:
Flash
Movie 或Java
Applet 执行一些套接字通信您可以使用 websockets,但作为一个新的 HTML5 功能,它有点受限。幸运的是,有socksjs,它在不处理它的浏览器上实现 websockets。
在托管方面,您应该能够使用任何 websockets 服务器,其中有一些用于 PHP。
如果您希望实现使用 PHP/JSP 等脚本语言编写的聊天服务器,则必须从您的选项列表中勾选挂起 HTTP 连接的技术。原因是大多数网络服务器(特别是共享主机)不喜欢挂起太多的连接。
您可以在此“针对服务器端脚本语言的优化聊天服务器协议”出版物中找到实现 Web 客户端和 PHP 聊天服务器所需的一切。
我见过的最佳策略是对消息执行 AJAX 请求,然后在完成后立即重新启动完全相同的请求。
在服务器端,使脚本“停止”60 秒或直到收到新消息。这会使同一连接最多保持打开 60 秒,但当收到新消息时,它会输出并立即停止,提示客户端 AJAX 打开另一个连接。
这提供了新消息的几乎即时通知,并且在服务器上也比每 x 秒建立一个新连接更容易。