如何用PHP制作聊天室脚本?

dat*_*.io 4 php chatroom

有几位访问者访问http://site.com/chat.php

他们每个人都可以编写短信并发送到chat.php,它会立即显示在每个人的浏览器上(http://site.com/chat.php)

我必须使用数据库吗?我的意思是,AJAX或PHP缓冲功能是否适合会话中的聊天室?

不同用户的会话如何彼此共享数据?

任何想法或见解将不胜感激,谢谢!

编辑:感谢您的链接.但我想要的是将数据推送到客户端浏览器的方式.是不断刷新客户端浏览器(AJAX与否)的唯一方法?此外,这里的挑战是不同的用户(例如,2,1对1)如何共享聊天文本?你如何存储它们?你如何在两个客户之间同步文本?最好不要使用数据库.

编辑2:实际上,Peter D提到的YShout做得很好.它似乎不会继续刷新浏览器.但我不明白它是如何将新消息推送到现有用户的窗口的.

ste*_*efs 17

有(大约)3种创建聊天应用程序的选项:

插座

使用flash/java和socket作为前端,并使用支持socket的编程语言作为后端.对于后端,我建议使用java或python,因为它们具有多线程和NIO功能.它可以用PHP来实现(但是php不能真正做到高效的多线程,并且通常不适合这个).如果您需要高性能,这可能是一个选项,可能不是您想要的.

使用ajax并拉

在这种情况下,如果发生了新事件,所有客户端都会不断(例如,2秒钟)进行轮询.这感觉很奇怪,因为你只能在这些间隔得到答复.另外,它给你的服务器和带宽带来了很大的压力.你知道一个应用程序使用这种技术,因为浏览器不断刷新.这是一个次优的解决方案.

使用ajax并推送

这适用于多部分响应,并在后端运行长时间(php-)脚本.不是最好的解决方案,但大部分时间它比拉动更好,它可以工作,并在几个众所周知的聊天应用程序中使用.这种技术有时被称为COMET.

我的建议:如果您需要一个用于生产用途的聊天应用程序,请安装现有的应用程序.编程聊天应用程序是不是那个容易.

如果你只是想学习它,从一个简单的ajax/pull应用程序开始,然后尝试使用ajax和push编程.

是的,很可能你需要一个数据库,我很难成功实现一个非常简单的ajax/pull解决方案,它可以与文本文件一起使用(但我肯定不会在生产中使用它!).

它(据我所知,但我很确定)不可能创建一个没有服务器端后端的聊天应用程序(只有前端的javascript)!

UPDATE

如果你想知道如何完成数据推送,请查看源代码:http://wehrlos.strain.at/httpreq/client.html.async multipart就是你想要的:)

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 );
    }

}
Run Code Online (Sandbox Code Playgroud)

每次数据到达时都会调用showReq ,而不是像普通的ajax请求一样(我不是在这里使用jquery或prototype,所以代码有点肥胖 - 这真的很老:)).

这是服务器端部分:

<?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";

?>
Run Code Online (Sandbox Code Playgroud)

UPDATE2

有关数据库:如果你有一个什么共享架构像后端mod_php,并且/ CGI,你definitley需要一些实物,如数据库或TEXTFILES外部存储.但是:您可以通过编写自己的http服务器来依赖内存(可能使用php,但我不推荐它用于认真的工作).这并不是很复杂,但可能有点超出你的问题的范围^^

UPDATE3

我犯了一个错误!让一切都搞砸了,因为很长一段时间我真的做了类似的事情.以下是更正:

  1. 多部分响应仅适用于Mozilla浏览器,因此使用有限.COMET并不意味着多部分响应.

  2. COMET表示:传统的单部分响应,但保持(具有无限循环和休眠)直到有可用数据.所以浏览器对每个动作都有1个请求/响应(在最坏的情况下),而不是每x秒一个请求,即使没有任何响应值发生.