Home >Backend Development >PHP Tutorial >PHP聊天室技术

PHP聊天室技术

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-01 14:26:351227browse

php聊天室技术
黄国辉

1.前言
   上网聊天是时下最流行的交友方式。各大网站推出的聊天室都各具特色。
   聊天室主要分为WebChat、BBSChat两种。BBSChat是基于Telnet的Tcp协议,是BBS的附设功能,需要客户端Telnet程式。WebChat则采用浏览器方式,实际上是个多人一起使用的CGI程式。其基本原理是把每个用户的发言通过浏览器传给系统,再由系统收集处理后分发给特定用户。
   WebChat一般采用Server Push或Client Pull技术。两种技术的区别在于使用不同的方式将数据分发给用户,Server Push是由服务器将数据以多重MIME编码,推给(push)使用者端,现在较少网站使用这种方式。Client Pull则是用户从服务器拉(pull)所要的数据。
   最常用的Client Pull就是利用Html语言的Meta标签http-equiv="Refresh" 的属性,每隔一段时间就检查服务器上是否有新的数据。例如 ,每隔5秒钟就会刷新一次页面。这种方法简单有效,缺点是刷新时会产生闪烁的现象;而且为了保持效率,每次刷新都会把旧的聊天内容清除,用户想查看或保留对话内容都很不方便。为此,采用javaApplet作为聊天室的前端,利用刷新把从服务器Pull的数据通过JavaApplet来显示也是一种解决方案。更有就是本文要介绍的使聊天程式保持连线的方案。方法一,把聊天程式配置为无限大,就能使浏览器不停地保持下载的连线状态;方法二,聊天程式中存在着无限循环,因为能够方便地配置更高级的功能,所以在此选择采用。
   Web服务器采用FreeBSD+Apache,原因是两者的组合具备最强的性能,而且花费为零。还需要考虑的是用什么方式来存放数据呢。用文档相对而言容易实现,但是多人使用,频繁地对同一文档进行IO操作,难免会影响效率,况且FreeBSD的IO性能不佳。能够考虑使用RamDisk,将文档整个放进内存,以提高速度。或在内存中划分出一块高速空间用以数据存放。笔者使用的是数据库方式:MySQL。因为该数据库就是为大批量用户同时使用而设计,利用他能够省去设计高速空间操作的复杂编写,速度也可得到确保。如将整个数据库放进内存,效果更好。
   程式用PHP+Html+JavaScript编写。聊天室主要是对Html的Form中的各种元素进行操作。Javascript是基于对象的语言,对Html中的各种元素皆当作对象看待,所以每个元素的方法和属性都很丰富,操作比较方便。而PHP只有在Form经过Post后,将Form中的元素转成对应的变量,才能处理用户输入的数据。从交互性来说比较差,这也是使用JavaScript的原因。采用PHP的原因是因为比起其他CGI语言,其速度和安全性都较佳,研发也比较容易。

2. 不断刷新的聊天室
   一个标准的聊天室页面由三个Frame组成,分别是显示在线用户的Online、用户发言及功能配置的Say和显示聊天内容的List。用户在Say Frame中敲入发言内容后按发送,数据经过处理后保存在Mysql数据库,同时被保存的还包括发言人、聊天对象及发言的时间。用户一进入聊天室,List Frame从Mysql数据库中把发言时间大于用户进入时间的发言提出显示出来。而后续显示新的发言内容的关键,在于显示聊天内容的那段程式是无限循环的。
  List Frame程式概要:
   $db=mysql_pconnect(localhost,root);   #Mysql数据库连接
   mysql_select_db(chat,$db);
   显示欢迎进入聊天室
   配置$init为数据库中发言时间比
    进入时间大的第一个数据的ID号  #是数据提取的标志位
   while (1==1) {       #无限循环开始
   提取从$init到最后的数据;
   while (每一个数据$text) {
   $emote=strip_tags($text);     #防止用户直接输入Html语言
   if (eregi("^/",$emote))     #判断发言是否系统命令(以/开头)
    系统特别处理
   else 显示发言
   }
   配置$init为最后数据的ID号
   flush();        #清出输出缓冲,使发言马上显示
   sleep(2);        #使程式暂停2秒,节省系统资源
   mysql_free_result($result);    #释放数据库结果占用的内存
   }
   因为程式无限循环,在每次循环中输出的发言是先置入输出缓冲区内。通过flush()马上把缓冲区的内容向用户的List Frame送出,达到了实时的聊天效果。循环最后要释放Mysql结果集占用的内存,否则因为无限循环的缘故,系统资源很快会被耗尽。
   用户在Login后将建立一个Online的表用于在线用户的统计,主要是为了防止User表过大,程式中频繁用到的检索会拖慢系统的运作。这其中用的最多的是Online Frame,在采用Client Pull的Refresh Meta,每隔一段时间就会查询Online表,以刷新在线的用户。假如用户不发言超过规定时间,系统会调用自定义函数将用户设为TimeOut,强制将其退出聊天室。

1 2  下一页
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn