网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > PHP技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.WINDOWS服务器安装多套PHP的另类.
.Zend Framework食谱.
.win2003 iis整合php后 环境变量无.
.PHP Squid中可缓存的动态网页设计.
.浅议PHP程序开发中的模板选择.
.MVC真的适合PHP么?.
.PHP 5.0对象模型深度探索之访问方.
.发挥语言的威力--融合PHP与ASP.
.PHP下对缓冲区的控制.
.为php4加入动态flash文件的生成的.
.使用"函数递归"实现基于php和MyS.
.通过ODBC连接的SQL SERVER实例.
.用DBSQL类加快开发MySQL数据库程.
.在PHP5中使用DOM控制XML.
.PHP Extended CHM 中文手册.
.PHP利用COM对象访问SQLServer、A.
.php配置文件php.ini的中文注释版.
.40个迹象表明你还是PHP菜鸟.
.php对gb编码动态转utf-8编码的几.
.PHP高级OOP技术演示.

PHP聊天室技术(1)

发表日期:2008-6-27


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]
上一篇:oracle资料库函式库 人气:10769
下一篇:PHP 如何向 MySQL 发送数据 人气:9906
浏览全部PHP聊天室的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐