如何使用XAJAX和PHP编写实时聊天?
换句话说,有没有办法将xajax响应从服务器发送到多个客户机?或者,在客户端每隔几秒钟检查一次新消息是唯一的可能吗?
发布于 2009-06-08 18:58:30
不是的。客户端必须重复地“轮询”服务器。
我认为这里的关键是思考交互设计。诀窍是欺骗用户,使其认为聊天是即时的,但实际上它每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。也就是你接受他们的请求,假装开始发回数据,但是你只是暂停了一下。当发生某些事情时,您可以使用适当的数据完成响应。为了让它起作用,我相信你需要编写你自己的HTTP服务器,因为你不能让250个php进程在内存中挂起。也许Lighttpd可以以某种方式与LUA缓存模块一起使用。我不知道。不过会很有趣的。见鬼,我总得试一试吧:)
发布于 2009-06-08 17:30:03
当然有,但我不认为它对很多用户来说是非常有效的。您可以进行轮询,让每个客户端轮询服务器以查看是否有新消息,也可以使用服务器可以将新消息推送到客户端的comet technique -查看Comet plugin for XAJAX。我不知道如何使用XAJAX和PHP实现它,但这里是我尝试实现它的方法。
让每个客户端连接到服务器(登录等),然后:
使用像ejabberd这样的真正的IM服务器可以走很长的路,更有效率,并允许您的用户通过桌面客户端进行连接(如果这是您想要的)。我可能会使用它作为后端,IOW ejabberd将是服务器,而PHP将是使用XMPP in PHP的客户端,并充当webgui的代理。
另请参阅:
Google Techtalk on Gmail's chat feature (and scalability issues)
那是我的0.02美元
发布于 2009-06-08 16:59:53
只要没有超文本传输协议推送技术,你就永远不会只使用JavaScript
进行实时聊天。
可能的变通方法:
Flash
电影或Java
小程序在服务器端执行一些套接字轮询请求,持续几秒钟
https://stackoverflow.com/questions/965890
复制相似问题