当前位置:  编程技术>php
本页文章导读:
    ▪PHP聊天室技术       PHP聊天室技术 黄国辉 1.前言 上网聊天是时下最流行的交友方式。各大网站推出的聊天室都各具特色。 聊天室主要分为WebChat、BBSChat两种。BBSChat是基于Telnet的Tcp协议,是BBS的附设功能,需.........
    ▪在windows iis5下安装php4.0+mysql之我见       我接触php有段时间了,一直在公司配置好的环境下开发,总想试试自己安装一下,终于我的同学给了我这个机会。现在我将自己根据本站文章再发表一下我的看法和一点补充。   一,安装m.........
    ▪PHP安装攻略:常见问题解答(二)       四、 问:当我将PHP和APACHE一起编译时,好象有问题。它总是说无法找到httpd.h文件,可事实上该文件时存在的。为什么? 答:你需要让PHP配置/安装脚本知道你的APACHE源码的最高级目录,而.........

[1]PHP聊天室技术
    来源: 互联网  发布时间: 2013-11-30

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,强制将其退出聊天室。

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



    
[2]在windows iis5下安装php4.0+mysql之我见
    来源: 互联网  发布时间: 2013-11-30
我接触php有段时间了,一直在公司配置好的环境下开发,总想试试自己安装一下,终于我的同学给了我这个机会。现在我将自己根据本站文章再发表一下我的看法和一点补充。
  一,安装mysql.
   首先下载一个软件包是必须的,然后将其解压到你的的临时目录,点击安装程序,根据程序中的说明提示安装完。
    第2步,根据本站的文章应在“开始”---“运行”中键如“c:\mysql\bin\mysqld-nt - install”来运行程序,再在“管理工具”找到其“mysql"并使之运行,可是我我按照其方法就是不行,最后我就直接进入mysql安装目录,直接运行C[你的安装盘]:mysql\bin\win\mysqladmin.exe.后(第一次必须键入你的用户名和密码)用户渴望的红绿灯就出现了。到现在mysql就安装完了。
二,安装php4.0
   当然还是要其软件包,将软件包解压到你的安装目录下,接着将目录下的php.exe和php.ini-dist两个文件拷到c:\winnt下;将c:\winnt\php.ini-dist改名为php.ini,并打开它,找到;Windows Extensions,将extension=php_calendar.dll(这个文件可能有些软件包没有,我就没有,但我没有设置它还是照常用)、extension=php_zlib.dll、extension=php_ldap.dll........(这些应该是你php中包含有的*.dll)前的“;”去掉;如果你想修改你的上传临时目录可以找到 Paths and Directories这一栏后,将其:;upload_tmp_dir=添入你的的存放目录!完毕后关闭该文件。再将目录下的所有dll文件拷到c;\winnt\system32下,不要覆盖已有的dll文件; 打开“开始”按钮下的“控制面板”下的“管理工具”下面的“internet服务管理器”,选中“默认web站点”,打开它的“属性”窗口。在“web站点”页下,改变“IP地址”:“全部未分配”为“(您机子的ip地址,例如:127.0.0.1其实一般对于个人来说默认的就是127.0.0.1)”;“TCP端口”为“80”。  
   接着,选中“主目录”页,单击“应用程序设置”下的“配置”按钮后,在新窗口下单击“添加”按钮;在“可执行文件”中输入“C:WINNTphp.exe %s %s”,在“扩展名”中输入“.php”,点击“确定”。当然你想要其他的扩展名例如*.php3等等可以再添加:“C:WINNTphp.exe %s %s”,在“扩展名”中输入“.php3”,点击“确定”。  
   接着,选中“ISAPI筛选器”页,单击“添加”按钮;在“筛选器名称”中输入“php”,在“可执行文件”中输入“C:\WINNT\system32\php4isapi.dll”,点击“确定”。  
   接着,选中“文档”页,单击“添加”按钮;在“默认文档名”中输入“index.php3”(这些当然是你想环境默认什么文件就添入什么文件也可以不要),点击“确定”,并将其提高到最高级。
   关闭所有窗口,重启系统后,可打开IE浏览器进行测试。
   哈哈。是不是出来了,走出去玩玩........  

【本文版权归作者与奥索网共同拥有,如需转载,请注明作者及出处】    

    
[3]PHP安装攻略:常见问题解答(二)
    来源: 互联网  发布时间: 2013-11-30
四、

问:当我将PHP和APACHE一起编译时,好象有问题。它总是说无法找到httpd.h文件,可事实上该文件时存在的。为什么?

答:你需要让PHP配置/安装脚本知道你的APACHE源码的最高级目录,而不是包含httpd.h文件的目录。也就是说,应该指定"--with-apache=/path/to/apache/"而不是"--with-apache=/path/to/apache/src"。


五、

问:我使用RPM安装了PHP,但APACHE却不能处理PHP文件。为什么?

答: 假设你使用RPM正确安装了PHP,那你必须反注或加入下面的几行到httpd.conf文件中:

#Extra Modules
AddModule mod_php.c
AddModule mod_php3.c
AddModule mod_perlc.
#Extra Modules
LoadModule php_module modules/mod_php.so
LoadModule php3_module modules/libphp3.so
LoadModule perl_module modules/libperl.so

另外,再加入:

AddType application/x-httpd-php3 .php3

到httpd.conf的全局部分,或到你需要提供PHP支持的部分。 

    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3