PHP聊天室技术 |
本文标签:PHP聊天室 PHP聊天室技术 黄国辉 复制代码 代码如下: $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,强制将其退出聊天室 。 3. 用户功能简介 用户的功能设置在Say Frame中,可以选择发言贴图、说话的语气等 。发言经过特殊的处理后存储到Mysql,例如选择了一个贴图后,系统将添加到发言的前面,就可以实现贴图的效果 。 对于聊天室常用到的Emote,例如用户A输入“/hello”按发送,List Frame中显示出来的是“用户A愉快地和大家打招呼”,为了保持效率,用户输入的Emote会原文直接保存到数据库,而解析转换的工作由List Frame来完成 。 悄悄话只有自己和聊天对象可以看到,实现上因为发言预先保存有发言人和聊天对象,只要做一个简单的判断即可 。还有聊天室常有的屏蔽某用户发言的功能,通过设置一个临时的阵列来实现,没必要保存在用户的数据库中 。 聊天室人多的时候,大家争先发言常使人眼花缭乱,这时可以选择是否屏蔽无关的发言,即意味着只要不是对所有人和自己的发言将不会显示出来 。当然,因为系统会用特殊的颜色来标识和自己有关的发言,就算不选择该功能,用户还是能快速地从众多发言中找到和自己相关的 。 用户可以在特定时间(系统比较空闲时)将当天和自己有关的发言打包 。因为存储发言的表数据增长速度很快,为保持运行效率,系统隔天就会把它复制后清空 。这样用户检索打包发言内容就不会影响聊天系统的运作 。 出于安全的考虑,聊天室的管理功能是独立的,并没放在聊天页面中 。主要有用户资料管理和将捣乱用户Kick Out(踢人)两种功能 。将用户踢出聊天室后将使他在一定的时间内不能再进入聊天室 。 聊天室的安全要求虽然不象电子商务那样高,但如果用户被冒名顶替、用户的发言被窃听,或者乱踢人,是非常令人不快的 。用户都要在Login中填写名字和密码才能进入聊天室,但是通过查看Login的源代码,虽然不能看到Php的部分,Htnl部分的源码却显示Login是调用Chat.php程序从而进入聊天室的 。所以为了防止用户直接进入聊天室,系统会首先判断新建立的聊天室是否由Login产生的,不是则退出 。同理,在聊天室的List Frame和Post Frame也可加上这样的防护 。当然,在List Frame和Post Frame中检查用户的身份和密码,就万无一失了,只是加重了系统的负担 。 综上所述,能看到系统的源代码无疑是危险的开端,所以系统的编写尽量用看不到源码的Php;设置由Login开启的聊天室隐藏了浏览器的工具条、状态栏等,并且屏蔽了鼠标的右键及快捷键 。 4. 总结 用Php编写的聊天室具有高效稳定的特点,是编写网络交互程序的最佳选择 。 参考文献: [1] Rasmus Lerdorf著. PHP Manual [M].电子文档,2000 |