• 技术文章 >后端开发 >php教程

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

    PHP中文网PHP中文网2016-05-17 08:58:55原创752
    本篇文章是对PHP实现聊天室的源代码进行了详细的分析介绍,需要的朋友参考下

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

    代码如下:

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <!--载入配置文件-->
    <?php include_once 'config.php';?>
    <!--页面标题-->
    <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('scrollWindow()',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('publist').scrollTop = document.getElementById('publist').scrollHeight;
     setTimeout('scrollWindow()',200);
    }
    </script>


    5,屏蔽刷新技术
    屏蔽刷新,就是屏蔽<F5>键、屏蔽鼠标右键和隐藏浏览器中的“刷新”按钮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)屏蔽<F5>键
    屏蔽<F5>键,是通过触发键盘按下事件(onkeydown)来控制的。当用户按键时,系统对event对象中的keyCode属性判断按键。如果是<F5>键,则弹出警告框,并将按键设置为0。<F5>键的键值为116.

    代码如下:

    //禁止刷新
    <script language="javascript">
    function enterkey(){
     if(event.keyCode == 116){ //如果按键是F5键
      alert('禁止刷新');  //弹出警告框
      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('禁止鼠标右键');
      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('PATH',dirname($_SERVER['SCRIPT_NAME'])); //聊天室目录
     define('CHAT_NAME','PHP聊天室');   //聊天室名称
     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('#',$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.'#'.$ip.'#'.$sex.chr(13).chr(10);  //chr(13) 是一个回车,Chr(10) 是个换行符,chr(32) 是一个空格符
     $fp = fopen($file,'a');   //写入方式在文件末尾追加信息
     $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('#',$value); //使用#拆分字符串
      $userarr[] = $tmparr[0].','.$tmparr[2];  //将用户名和用户性别保存到新数组中
     }
     return $userarr;


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

    代码如下:

    function addmess($file,$mess){
     $fp = fopen($file,'a');  //以追加的形式打开文件
     $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('#',$value);  //使用#拆分字符串
      if($tmp[0] != $user){ //如果变量中的用户名和当前用户不相等
       $rearr[] = $value; //将该用户信息保存到新数组中
      }
     }
     $fp = fopen($file,'w+'); //以只写的方式打开文件
     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
     }
    }
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP 聊天室
    上一篇:PHP随机字符串生成代码(包括大小写字母)_php技巧 下一篇:PHP 读取大文件的X行到Y行内容的实现代码_php技巧
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 整理总结nginx、php-fpm和mysql等的权限划分• PHP5中Cookie与 Session使用详解_PHP• php对大文件进行读取操作的实现代码_PHP• PHP排序算法的复习和总结_PHP• 优化PHP程序的方法小结_PHP
    1/1

    PHP中文网