几个游客连接 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

我犯了一个错误!得到的一切混合起来,因为它已经很长一段时间我实际上没有类似的东西。这里的更正:

  1. 分段的答复只有工作mozilla浏览器,因此只有有限的使用。彗星并不意味着分段的回应。

  2. 彗星是指:传统的单部分的响应,但举行(具有无限的循环和睡眠的),直到有可用数据。因此浏览器有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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top