题
我怎么可以写一个实时聊天使用XAJAX和PHP?
换句话说,是否有一种方式发送xajax响应从服务器上的多个客户?或者是唯一的可能性,以检查新的消息,每隔几秒钟就客户的身边?
解决方案
没有。客户端必须 “轮询” 服务器repeatadly。
我觉得这里的关键是要考虑交互设计。关键是要在用户误以为该聊天是即时的,但是当实际上它更新一次,每1或2或3或10秒。
思路:
1)当用户发送消息时,在聊天直接显示它并触发轮询。
2)如投票回来与来自其他用户的多条消息,不添加一次全部,实际添加它们在一段1-2秒左右的,具有随机间距,使它看起来像他们”再在“瞬间”和独立的到来。 (如果一束消息中的,一旦用户是非常快进来意识到聊天更新那里,然后,和不continiously。)
3)如果用户是空闲的时间x量。降轮询速率到每10秒左右。
4)如果用户是活动的,即发送大量的邮件,轮询更频繁。
5)有你写的时间聊天最后更新于每个通道的静态文件。例如文件chat-teenfun-lastupdate.txt
有内容1224934239
或任何时间格式你喜欢。静态地服务于这个文件,然后让客户机轮询该文件以检查通道已经更新,而在调用chat-poll.php?ch=teenfun
,做了动态检查。静态文件供应各地快10-100倍,这取决于所涉及的动态脚本的工作,你会需要它时,你会得到250个+用户投票。
祝你好运,玩得开心!
/ 0
PS。 另外,您可以居然让客户做一个AJAX调用服务器,并让他们“挂”。这是你接受他们的请求,并假装开始发送数据回,但你只是暂停。当一些happends完成与选择恰当的数据的响应。对于这个工作,我相信你需要,虽然编写自己的HTTP服务器,即专门做这个,因为你不能有250个PHP进程在内存中徘徊。也许Lighttpd的可以在某种程度上这种方式与LUA缓存国防部使用。我不知道。将是有趣的,但。地狱我一定要尝试它的某个时候:)
其他提示
肯定有,但我不认为这将是非常有效的,与许多用户。你可以做询这里每个客户调查服务器以看到,如果有任何新的消息,或者您可以使用 彗星技术 在其服务器可以推动的新消息的客户,检查了 彗星的插件对XAJAX.如何,这将是实施使用XAJAX和PHP超出了我,但这是怎么我会努力实现它。
让每个客户连接到服务器(登录等等),则:
- 对于每一个消息发送的客户(发送者)更新的信息队列为客户(接收器)
- 让客户调查服务器的新消息在排队/推动的新消息通过彗星。
- 更新GUI如果有新的消息。
- 冲洗干净,泡沫,请重复
使用一个真正的讯服务器等ejabberd可能很长的路要走,以更有效和允许用户连接到客户的桌面(如果这是你想要的).我可能会使用,作为后端,IOW ejabberd将服务器和PHP将是客户使用 。在PHP, 和充当代理的webgui.
参见:
谷歌Techtalk Gmail上的聊天功能(和可扩展性问题)
这是我的0.02美元
只要没有不HTTP推动技术的你将永远不会得到一个只有使用实时聊天 JavaScript
.
可能workarrounds:
- 使用
Flash
电影或Java
小程序来执行某一套接通信 - 抱询请求在服务器上面几秒钟
您可以使用WebSockets,但作为一个新的HTML5功能,它还挺有限。幸运的是有 socksjs ,这对不处理它的浏览器实现的WebSockets。
在托管服务方面,你应该能够使用任何WebSockets的服务器,有一个为PHP等等。
如果您正在寻找实现与脚本语言如编写的聊天服务器PHP / JSP,挂HTTP连接将有技术,从你的选择名单中勾掉。原因是大部分的网页西弗斯(特别是共享主机)的不喜欢太多的连接挂。
您可以找到您需要实现Web客户端和PHP聊天服务器在此的 “优化聊天服务器协议服务器端脚本语言” 出版物。
我见过的最好的策略是做对消息的AJAX请求,然后重新启动完全相同的请求,只要它完成。
在服务器端,使脚本“失速” 60秒或直到接收到新的消息。这使打开60秒的最大值相同的连接,而是接收到新的消息时,它输出它并立即停止,促使客户端AJAX打开另一个连接。
此提供了新的消息的几乎即时通知,也是在服务器上比建立新连接每x秒容易得多。