PHP聊天室技术

2016-01-29 14:47 7 1 收藏

PHP聊天室技术,PHP聊天室技术

【 tulaoshi.com - PHP 】

  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秒,节省系统资源
  

来源:http://www.tulaoshi.com/n/20160129/1494222.html

延伸阅读
标签: PHP
  //第一个页面  name="index1.php" <? include "../signup/mysql.php"; $time1=time(); //$userid=983530409; echo $n; if($n==1){ $userid=time(); $nick="g".$userid; $last_time=$userid; $sql="insert into chat_user (userid,id,last_time) values ('$userid','$ni...
标签: PHP
  //第二页面 name="frame2.php" <? include "../signup/mysql.php"; header("Expires: Sun, 28 Dec 1997 09:32:45 GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); header("Content-Type: text/html; charset=${Charset}&...
标签: PHP
  第三个页面 name="frame3.php" <? include "../signup/mysql.php"; //echo $userid; //echo $private; if($p)$p=1; else $p=0; if(($action="ok")and($p)){ $sql="select userid,id from chat_user_list where userid='$userid'"; $result=mysql_query($sql); $roww=mysql_fe...
标签: PHP
  第四个页面 name="index.php" <? include "../signup/mysql.php"; header("Expires: Sun, 28 Dec 1997 09:32:45 GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); header("Content-Type: text/html; charset=${Charset}&quo...
标签: PHP
  chtcont.php3: 代码如下: <?php         $sCont="";         $ConnID=@odbc_connect("jtfcht","admin","");         if ($ConnID){    &...

经验教程

113

收藏

57
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部