Home  >  Article  >  Backend Development  >  PHP实现简单聊天室(附源码)_php技巧

PHP实现简单聊天室(附源码)_php技巧

PHP中文网
PHP中文网Original
2016-05-17 08:58:551578browse

本篇文章是对PHP实现聊天室的源代码进行了详细的分析介绍,需要的朋友参考下

一,聊天室模块实现
1,聊天室主页面窗口设置

代码如下:

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<!--载入配置文件-->
<?php include_once &#39;config.php&#39;;?>
<!--页面标题-->
<title><?php echo CHAT_NAME; ?></title>
<script language="javascript" src="main.js"></script>
<frameset rows="80,*,100" cols="*" frameborder="yes" border="1" framespacing="0">
<!--顶部窗口-->
 <frame src="top.php" name="topFrame" scrolling="No" noresize="noresize" id="topFrame" title="topFrame" />
 <frameset rows="*" cols="168,*" framespacing="0" frameborder="yes" border="1">
<!--左侧窗口-->
  <frame src="list.php" name="leftFrame" scrolling="No" id="leftFrame" title="leftFrame" />
  <frameset rows="70%,*" cols="*" framespacing="0" frameborder="yes" border="1">
<!--公共聊天窗口-->
   <frame src="center.php" scrolling="auto" name="mainFrame" noresize="noresize" id="mainFrame" title="mainFrame" />
<!--私聊窗口-->
   <frame src="private.php" scrolling="auto" name="priFrame" id="priFrame" title="priFrame" />
  </frameset>
 </frameset>
<!--发言窗口-->
 <frame src="talk.php" name="bottomFrame" scrolling="No" noresize="noresize" id="bottomsFrame" title="bottomFrame" />
</frameset>
<noframes>
<body></body>
</noframes>


2,文件操作函数
本聊天室模块使用文本来保存用户列表和发言信息,主要考虑对文件的操作在速度上要优于对数据库的操作。

(1)fopen()函数,打开文件或者URL,如果打开失败,函数返回FALSE
语法:fopen(filename,mode,include_path,context)
参数说明:
filename:
必须,规定要打开的文件或URL
mode:必须,规定要求到该文件/流的访问类型。
include_path:可选,如果也需要在include_path中检索文件的话,可以将该参数设为1或TRUE。
context:可选。规定文件句柄的环境,context是可以修改流的行文的一套选项
mode参数的取值:
"r":只读方式打开,将文件指针指向文件头。
"r+":读写方式打开,将文件指针指向文件头。
"w":写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。
"w+":读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。
"a":写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建。
"a+":读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建。"x":创建并以写入方式打开,文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建。"x+":创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回FALSE,并生成一条E_WARNING级别的错误信息。如果文件不存在则尝试创建。

(2)fclose()函数,关闭打开的文件
语法:fclose(file)
参数:file:必须,规定要关闭的文件。file参数是一个文件指针,fclose()函数关闭指针指向的文件。文件指针必须有效,并且是通过fopen()或fsockopen()成功打开的文件。如果成功则返回true,否则返回false。

(3)读取文件函数
********
fgets(file,length)函数用于一次读取一行数据
file:必须,规定要读取的文件
length:可选,规定要读取的字节数,默认是1024字节。从file指向的文件中读取一行并返回长度最多为length-1字节的字符串。碰到换行符(包括在返回值中)、EOF或者已经读取了length-1字节后停止。如果没有指定length,默认为1K,或者说1024字节。若失败,则返回false。
********
file(path,include_path,context),将文件作为一个数组返回,数组中的每个单元都是文件中相应的一行,包括换行符在内。若失败,则返回false。
path:必须,规定要读取的文件。
include_path:可选。如果想在include_path中搜索文件,将该参数设为1.
context:可选。规定文件句柄的环境。context是一套可以修改流的行为的选项,若使用null,则忽略。
********
file_get_contents(path,include_path,context,start,max_length),是用于将文件的内容读入到一个字符串中的首选方法。
path:必须,规定要读取的文件
include_path:可选,如果也想在include_path中搜寻文件的话,可以将该参数设为"1".
context:可选,规定文件句柄的环境。context是一套可以修改流的行为的选项。若使用null,则忽略。
start:可选,规定在文件中开始读取的位置。
max_length:可选,规定读取的字节数。

(4)写入文件函数
写入数据也是PHP中常用的文件操作,在PHP中可以使用fwrite()和fputs()函数向文件中写入数据。fputs()函数是fwrite()函数的别名。他们的用法相同。
语法:fwrite(file,string,length)
参数说明:
file:必须,规定要写入的打开文件。
string:必须,规定要写入的文件的字符串。
length:可选。规定要写入的最大字节数。
fwrite()把string的内容写入文件指针file处。如果指定了length,当写入了length个字节或者写完了string以后,写入就会停止。发write()返回写入的字节数,出现错误时则返回false。

(5)删除文件
unlink(filename,context)函数用于删除文件,该文件必须是关闭的,若成功则返回true,失败则返回false。
filename:必须,规定要删除的文件;
context:可选,规定文件句柄环境。context是可修改流的行为的一套选项。

3,定时刷新技术删除不发言用户
定时刷新,是指每隔一段时间,对象被重新加载一次,也可以只加载一次。使用javascript脚本能够轻松实现该功能。
(1)setInterval()函数
JavaScript中的setInterval()函数可以每隔一段时间,就执行一次操作。该函数语法格式如下:
window.setInterval(Function,MilliSeconds)
参数Function表明要执行的操作,可以是一个函数。
参数MiliSeconds表示间隔的时间,单位是毫秒。
使用setInterval()函数后,只要不关闭页面,该函数就会一直执行下去。如果想结束事件,可以使用clearInterval()函数。函数格式如下:
window.clearInterval(Interval)
参数Interval是setIntervald()函数的返回值。

(2)setTimeout()函数
setTimeout()函数和setInterval()函数用法相同,但setTimeout()函数只执行一次。用于在聊天室中定时删除不发言的用户。

4,滚屏显示时滚动条定位技术
聊天室中的滚屏功能,最新发言信息是显示在页面的最底部,而每次刷新时,页面焦点都被定位到最上面。滚动条的定位可分为整个页面窗口的滚动条和页面元素中的滚动条.

(1)窗口中的滚动条
窗口中的滚动条可以通过scroll()函数来实现定位。
语法:window.scroll(x,y)
参数x表示滚动条水平位置的坐标。参数y表示滚动条垂直位置的坐标。如果要将滚动条置底,那么只要将y的值设置大一些即可。

代码如下:

<script language="javascript"> //定位滚动条
function scrollWindow(){
 this.scroll(0,75000); //设置滚动条坐标
 setInterval(&#39;scrollWindow()&#39;,200); //每200毫秒执行一次函数
}
scrollWindow();
</script>


(2)页面元素中的滚动条
页面元素中的滚动条可以用scrollTop属性来实现定位。scrollTop属性表示当前对象的顶点距离其最外层对象元素的距离。语法如下:
object.scrollTop=distance;
在聊天室公共窗口中的滚屏效果,就是使用的该属性来定位滚动条。公共窗口使用一个p层来显示聊天信息。首先将p层的纵向滚动条设为自动,横向滚动条设为无并自动换行。

代码如下:

<p id="publist" style="width:800px; height:220px; overflow-x:hidden; overflow-y:auto; work-break:break-all; word-wrap:break-word; line-height:20px;">...</p>


在Javascript中设置纵向滚动条的scrollTop属性等于它滚动高度(定位到聊天窗口的最下面)

代码如下:

<script language="javascript">
//定位滚动条
function scrollWindow(){
 document.getElementById(&#39;publist&#39;).scrollTop = document.getElementById(&#39;publist&#39;).scrollHeight;
 setTimeout(&#39;scrollWindow()&#39;,200);
}
</script>


5,屏蔽刷新技术
屏蔽刷新,就是屏蔽ccde2a7792be66137d64a845dd265ef7键、屏蔽鼠标右键和隐藏浏览器中的“刷新”按钮3部分。每个部分使用的技术都不相同。

(1)隐藏“刷新”按钮
open()函数的作用是打开一个新窗口,并可以对窗口样式进行设置。
Open()函数的语法格式如下:
op=window.open([wName][,wFeature][,wReplace])
参数page表示要打开的网页。
参数wName表示要打开窗口的名称,可以是_blank、_parent等属性值,也可以是自定义名称。
参数wFeatures表示要打开的窗口的样式。
属性值如下:
fullscreen:yes,no,1,0;是否全屏
top:number;新窗口到上边界的距离
left:number;新窗口到左边界的距离
width:number;新窗口的宽度
height:number;新窗口的高
location:yes,no,1,0;是否显示地址栏
menubar:yes,no,1,0;是否显示菜单栏
resizable:yes,no,1,0;是否可以改变大小
scrollbars:yes,no,1,0;是否显示滚动条
status:yes,no,1,0;是否显示状态条
toolbar:yes,no,1,0;是否显示工具条
directories:yes,no,1,0;是否显示链接

(2)屏蔽ccde2a7792be66137d64a845dd265ef7键
屏蔽ccde2a7792be66137d64a845dd265ef7键,是通过触发键盘按下事件(onkeydown)来控制的。当用户按键时,系统对event对象中的keyCode属性判断按键。如果是ccde2a7792be66137d64a845dd265ef7键,则弹出警告框,并将按键设置为0。ccde2a7792be66137d64a845dd265ef7键的键值为116.

代码如下:

//禁止刷新
<script language="javascript">
function enterkey(){
 if(event.keyCode == 116){ //如果按键是F5键
  alert(&#39;禁止刷新&#39;);  //弹出警告框
  event.keyCode = 0;  //将按键归零
  return false;
 }
}
</script>

document.onkeydown=enterkey; //将函数赋值给onkeydown事件

(3)屏蔽鼠标右键
屏蔽鼠标右键有两种方法,第一种是通过event.button属性判断,如果button等于2,说明按下的是鼠标右键。该方法通过onmousedown时间来触发。

代码如下:

<script language="javascript">
//禁止鼠标右键
function mouseright(){
 if(event.button==2){
  alert(&#39;禁止鼠标右键&#39;);
  return false;
 }
}
document.onmousedown=mouseright;
</script>


但这种方法有一个漏洞,当用户单击鼠标右键,弹出警告框的时候,鼠标右键不松开,按回车键关闭警告窗口后,再松开鼠标右键,这是窗口还是会弹出来。
第二种方法是使用oncontextmenu事件调用event对象中的returnValue属性。oncontextmenu事件是用户在单击鼠标右键时,弹出一个菜单,而returnValue属性则可以取消事件。

代码如下:

<body oncontextmenu=self.event.returnValue=false>


6,监控客户端浏览器
在PHP中有一个函数ignore_user_abort()函数,当函数设置为True时,即使PHP页被关闭,页面代码还是会继续被执行。ignore_user_abort(true);
而connection_aborted()函数则可以监控客户端浏览器是否是断开的。int connection_aborted(void),当函数返回True时,说明客户端浏览器已经被断开。
使用该函数可以实现自动更新用户列表、删除掉线用户的功能。

二,聊天室
1,配置文件

代码如下:

<?php
 define(&#39;PATH&#39;,dirname($_SERVER[&#39;SCRIPT_NAME&#39;])); //聊天室目录
 define(&#39;CHAT_NAME&#39;,&#39;PHP聊天室&#39;);   //聊天室名称
 define("MESS", "mess.txt");     //聊天信息 
 define("PERSON", "person.txt");    //在线人名单
 define("RETIME",3);       //刷新时间
 define("LINE",11);       //公共窗口显示的行数
 define("PRLINE",5);       //私聊窗口显示的行数
 define("MAX",50);       //聊天室人数限制
 define("MAXTIME",600000);     //最大不发言时间,单位是毫秒
 define("WELCOME","<font color=blue>欢迎光临".CHAT_NAME.",请遵守聊天室规则,不要恶意刷新,不要使用不文明用语。</font>");  //欢迎语
?>


2,公共函数文件
(1)chklogin()函数检查用户昵称是否重复。参数$user是登录用户的昵称。当函数返回值为True时,昵称不可用;返回值为False时,昵称可用。

代码如下:

function chklogin($file,$user){
 $boo = false;
 if(file_exists($file)){
  $userarr = file($file);
  /* 判断昵称是否重复 */
  foreach($userarr as $value){ //判断昵称是否重复
   $tmparr = explode(&#39;#&#39;,$value); //使用“#”作为分隔符来拆分字符串
   if($user == $tmparr[0]){ //如果用户数组中包含此用户
    $boo = true;
    break;
   }
  }
 }
 return $boo;
}


(2)addlogin()函数将登录的用户昵称写入文件中,保存格式为:昵称#IP#性别,参数$file是保存的文件地址,$user是用户昵称,$ip是登陆IP,$sex表示用户性别。

代码如下:

function addlogin($file,$user,$ip,$sex){
 $tmp = $user.&#39;#&#39;.$ip.&#39;#&#39;.$sex.chr(13).chr(10);  //chr(13) 是一个回车,Chr(10) 是个换行符,chr(32) 是一个空格符
 $fp = fopen($file,&#39;a&#39;);   //写入方式在文件末尾追加信息
 $boo = fwrite($fp,$tmp);
 fclose($fp);
 return $boo;
}


(3)storeuser()函数的作用是将用户信息存为一个数组。格式为“用户名,用户性别”,参数$file是用户列表文件。代码如下:

代码如下:

function storeuser($file){
 $tmparr = file($file);  //将文件内容写入数组
 $userarr = array();  //创建数组
 foreach($tmparr as $value){  //循环输出数组内容
  $tmparr = explode(&#39;#&#39;,$value); //使用#拆分字符串
  $userarr[] = $tmparr[0].&#39;,&#39;.$tmparr[2];  //将用户名和用户性别保存到新数组中
 }
 return $userarr;


(4)addmess()函数将发言内容写入文件中。参数$file是保存的文件地址,$mess是要保存的内容

代码如下:

function addmess($file,$mess){
 $fp = fopen($file,&#39;a&#39;);  //以追加的形式打开文件
 $boo = fwrite($fp,$mess.chr(13).chr(10)); //将信息写入文件中
 fclose($fp); //关闭文件
 return boo;
}


(5)deluser()函数的作用是删掉用户。参数$file是保存的文件地址,$user是要删除的用户

 代码如下:

function deluser($file,$user){
 $tmparr = file($file);  //将文件内容写入数组
 $rearr = array(); //创建数组
 foreach($tmparr as $value){  //循环输出数组内容
  $tmp = explode(&#39;#&#39;,$value);  //使用#拆分字符串
  if($tmp[0] != $user){ //如果变量中的用户名和当前用户不相等
   $rearr[] = $value; //将该用户信息保存到新数组中
  }
 }
 $fp = fopen($file,&#39;w+&#39;); //以只写的方式打开文件
 foreach($rearr as $value){ //循环数组
  fwrite($fp,$value);  //写入数组内容
 }
 fclose($fp); //关闭文件
}


(6)getRows()函数的作用是返回文件的行数,参数$file是文件名

代码如下:

function getRows($file){
 if(file_exists($file)){  //如果文件存在
  $fl = file($file);  //将文件按行写入数组
  return count($fl);  //求出数组长度并返回
 }else{
  return 0;  //如果文件不存在,返回0
 }
}


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