题
几个游客连接 http://site.com/chat.php
他们每个人可以编写和发送短消息chat.php 它显示立即在每个人的浏览器(http://site.com/chat.php)
我需要使用一个数据库?我的意思是,AJAX或PHP缓冲能力,足以对这样一个聊天室在会议?
怎么可能会不同用户分享数据从各个方?
任何思想或见解,以理解的,谢谢!
编辑:谢谢你的链接。但是我想要的方式来推动数据的一个客户浏览器。是不断刷新客户浏览器(阿贾克斯或不)的唯一方式?还有这里的挑战是如何不同的用户,例如,2,1月1,分享聊天文本?如何做你的商店?你怎么同步的案文2之间的客户吗?不使用数据库的优选。
编辑2:实际上 YShout 提到过彼得*D做这项工作得很好。它似乎并没有保持刷新浏览器。但我不了解它是如何推动新信息的现有用户的窗口。
解决方案
有(大约)3个选项,对于创造一个聊天应用程序:
插座
使用闪/java和插座的前端和一套能够编程语言的后台。用后端,我建议java或蟒蛇,因为他们是多线程和仁王能力。这是可能做到这一PHP(但php不能真正做到有效的多线程和一般是不是真适合用于此)。这是一个选项,如果你需要高效,并且可能不是你要找的。
使用的ajax拉
在这种情况下,所有客户不断(例如过2秒)的投票如果有什么新的事情发生了。感觉很奇怪因为你只能得到答复在这些时间间隔。此外,它将很紧张你的服务器和带宽。你知道的应用程序使用这种技术,因为将浏览器不断刷新。这是次优的解决方案。
使用的ajax和推
这适用分段的答复和长期运行(php)中的脚本后端。不是最好的解决办法,但大多数时候,它比拉和它的工作并用在若干众所周知聊天应用程序。这种技术有时被称为 彗星.
我建议:如果你需要一个聊天应用程序,用于生产的使用、安装现有的一个。编程聊天应用程序是不是 那 容易的。
如果你只是想了解它,开始用一个简单的ajax/拉的应用程序,然后试图以程序使用的ajax和推动。
是的,最有可能你需要一个数据库,艰难的,我成功地实施了一个非常简单的ajax/拉解决方案,适用文本的文件有趣的(但是我肯定不会用它在生产!).
它是(据我所知,但是我很确定)不可能创造一个聊天应用程序,没有一个服务器的端后台(只有前端javascript单独)!
更新
如果你想知道数据如何推动完成后,看看源: http://wehrlos.strain.at/httpreq/client.html.异步分段是什么你想:)
function asSendSyncMulti() {
var httpReq = new XMLHttpRequest();
showMessage( 'Sending Sync Multipart ' + (++this.reqCount) );
// Sync - wait until data arrives
httpReq.multipart = true;
httpReq.open( 'GET', 'server.php?multipart=true&c=' + (this.reqCount), false );
httpReq.onload = showReq;
httpReq.send( null );
}
function showReq( event ) {
if ( event.target.readyState == 4 ) {
showMessage( 'Data arrives: ' + event.target.responseText );
}
else {
alert( 'an error occured: ' + event.target.readyState );
}
}
showReq被称为 每一个时间 数据达,不仅仅是一次一样,在常规ajax的请求(我不用jquery或原型,这样的代码是一个有点肥胖-这是真的老了:)).
这里的服务器侧的部分:
<?php
$c = $_GET[ 'c' ];
header('Content-type: multipart/x-mixed-replace;boundary="rn9012"');
sleep( 1 );
print "--rn9012\n";
print "Content-type: application/xml\n\n";
print "\n";
print "Multipart: First Part of Request " . $c . "\n";
print "--rn9012\n";
flush();
sleep( 3 );
print "Content-type: application/xml\n\n";
print "\n";
print "Multipart: Second Part of Request " . $c . "\n";
print "--rn9012--\n";
?>
update2
关于数据库:如果你已经有了一个没什么-公共建筑等mod_php/cgi在后台你 definitley 需要 一些 种外部储存,如数据库或文本文件.但是:你可以依靠记忆通过编写自己http服务器(可能php,但我并不推荐这对于严重工作)。这不是真的很复杂,但是可能的范围问题^^
update)3
我犯了一个错误!得到的一切混合起来,因为它已经很长一段时间我实际上没有类似的东西。这里的更正:
分段的答复只有工作mozilla浏览器,因此只有有限的使用。彗星并不意味着分段的回应。
彗星是指:传统的单部分的响应,但举行(具有无限的循环和睡眠的),直到有可用数据。因此浏览器有1的请求/回应的每一个动作(在最糟糕的情况下),而不是一个请求每x秒,即使没有什么反应值得会发生。
其他提示
您想提这没有一个DB工作,并没有客户机轮询更新服务器。
在理论上可以通过存储在服务器上的一个文本文件中的“日志”聊天,并改变你的页面,让用户做出chat.php页面上的GET请求做到这一点,但从来没有真正的PHP页面完成发送给用户。 (例如,响应从未完成)
您需要发回一些“的无操作的”数据保持连接时去没有消息,但在理论上这是可行的。
的问题是,为了实现上述仍然是大量的工作。你需要做的AJAX回发到服务器提交新的评论...该用户的浏览器将被纺的全部时间(除非你窝在聊天记录中的iframe - 例如,更多的工作)......而这种设置的也只是非常难以管理。
我建议抓住从其他地方自由交谈脚本(例如 http://tinychat.com/ )或者如果你想推出自己的(为了好玩/经验),然后继续前进,但有一个DB开始,建立一个页面,将推动并从服务器下拉消息。
最后,如果你担心“锤击”的使用AJAX请求的服务器......没有。只是建立聊天,那么,如果你发现有性能问题,返回StackOverflow的关于如何优化它使数百个请求不充斥聊天时,有没有活动的问题。
虽然HTTP不容易推动的,则可以通过让PHP脚本从来没有终止和JavaScript结果模拟推连接来仔细观看。
从本质上讲,你可以模拟一个流阅读。
如果您希望新用户加载他们进入房间,一个数据库或其他存储要求之前发生的聊天的历史。除非你要创建一个学习聊天,有太多的在那里免费使用的打扰。
http://tinychat.com 是另一种简单的聊天网站。
AJAX工作正常。我创建了一个简单的页面,我的网站之一。但我发现,聊天没有得到经常你会觉得使用。
共享数据变得更复杂一点,并会更容易通过托管IRC服务器,并允许用户使用具有数据交换能力IRC客户端来完成。虽然没有从具有一个用户上传到网站阻止你,然后其他人下载。人到人将难以与使用web接口,因为用户没有彼此的任何方式连接。
和它即时显示在每个人的浏览器
使用PHP / JS不能从服务器推送的数据到客户端。所以,你的客户需要,要求从服务器中的数据。而这正是scunliffe在他的岗位描述了。
您可以用HTML和Javascript使用像 PubNub 服务完全做到这一点。你不会需要一个数据库,你可以使用类似的历史API 以填充最后x聊天消息。
下面是构建一个聊天应用具有PubNub的快速教程。
在代码的10行实时聊天应用
Enter Chat and press enter
<div><input id=input placeholder=you-chat-here /></div>
Chat Output
<div id=box></div>
<script src=http://cdn.pubnub.com/pubnub.min.js></script>
<script>(function(){
var box = PUBNUB.$('box'), input = PUBNUB.$('input'), channel = 'chat';
PUBNUB.subscribe({
channel : channel,
callback : function(text) { box.innerHTML = (''+text).replace( /[<>]/g, '' ) + '<br>' + box.innerHTML }
});
PUBNUB.bind( 'keyup', input, function(e) {
(e.keyCode || e.charCode) === 13 && PUBNUB.publish({
channel : channel, message : input.value, x : (input.value='')
})
} )
})()</script>