PHP聊天室简单实现方法详解


Posted in PHP onDecember 08, 2018

本文实例讲述了PHP聊天室简单实现方法。分享给大家供大家参考,具体如下:

用户 => 客服 (先把信息入库,然后通过ob+长连接不断从数据库查询数据发送给客服)

客服 => 用户 (先接收用户信息,然后把回复信息入库,最后通过ajax轮询不断请求数据,显示到用户聊天界面)

【注意:】如果所有页面搭建好,先链接客服聊天页面(server.php) ,接着再链接用户页面(client.php)

附图说明:

PHP聊天室简单实现方法详解

第一步:建表

说明: rec : 接收信息方, sender : 发送信息方, content : 发送内容 , is_new : 作为标记,1是 新信息 2是 已读信息 (默认是1)

CREATE TABLE `chat_log` (
 `log_id` int(11) NOT NULL AUTO_INCREMENT,
 `rec` varchar(10) NOT NULL COMMENT '接受方',
 `sender` varchar(10) NOT NULL COMMENT '发送方',
 `content` text NOT NULL COMMENT '发送内容',
 `is_new` tinyint(4) NOT NULL DEFAULT '1' COMMENT '信息 1新信息 0 已读信息',
 PRIMARY KEY (`log_id`,`rec`)
) ENGINE=MyISAM AUTO_INCREMENT=105 DEFAULT CHARSET=utf8 COMMENT='用户客服聊天轮询表'

第二步:链接数据库 : connect.php

$link = mysql_connect('localhost', 'root', '');
mysql_query("set names utf8");
mysql_select_db("chat");

第三步:用户聊天界面: client.php

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>User窗口</title>
  <style>
    #user {
      width: 440px;
      height: 300px;
      border: 1px solid blue;
    }
  </style>
  <script src='http://code.jquery.com/jquery-latest.js'></script>
  <script>
    $(function () {
      $("#btn").click(function () {
        var content = $("textarea").val();
        if(content == ''){alert('发送内容不能为空');return;}
        // 发送给客服
        <!-- 把提交数据通过toServer.php存入数据库-->
        $.post("toServer.php", {'msg':content}, function (res) {
          var obj = JSON.parse(res);
          $("#user").append("<b>你向客服发送:</b>" + obj + "<br>");
          $("textarea").val(" ");
        });
      });
      // 用ajax轮询方式 从数据库获取 客服是否有发送消息给用户
      var polling = {
        "url"   : 'fromServer.php',
        "dataType" : 'json',
        success  : function (res) {
          //ajax请求返回的数据
          var obj = res;
          //追加到User聊天的页面
          $("#user").append("<b style='color:red'>客服回复:" + obj.content + "</b><br>");
          $.ajax(polling);
        }
      };
      $.ajax(polling); //轮询发送ajax请求
    })
  </script>
</head>
<body>
  <iframe src="" width="0" height="0" frameborder="0"></iframe>
  <h3>与客服聊天窗口</h3>
  <div contenteditable="true" id="user"></div>
  <div>
    <textarea name="msg_list" id="" cols="60" rows="15"></textarea>
    <button id="btn" type="button">send..</button>
  </div>
</body>
</html>

第四:用户发送信息入库 + ajax轮询查询有无客服回复信息

toServer.php

require('connect.php');
$msg = htmlspecialchars($_POST['msg'], ENT_QUOTES);
$sql = "INSERT INTO `chat_log` (rec, sender, content) VALUES('admin', 'user', '$msg' )";
mysql_query($sql, $link);
echo json_encode($msg);

fromServer.php

require('connect.php');
set_time_limit(0);//永不超时
while (true){
    $sql = "SELECT * FROM `chat_log` WHERE rec='user' AND is_new=1 ORDER BY log_id DESC LIMIT 1";
    $res = mysql_query($sql, $link);
    if($row = mysql_fetch_assoc($res)){
      $sql = "UPDATE `chat_log` SET is_new=0 WHERE log_id=".$row['log_id'];
      mysql_query($sql,$link);
      die(json_encode($row));
    }
}

 

第五步: 客服聊天页面 server.php

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>客服窗口</title>
  <style>
    #server {
    width: 440px;
    height: 300px;
    border: 1px solid blue;
    }
  </style>
  <script src='http://code.jquery.com/jquery-latest.js'></script>
  <!-- 进行ob缓存输出 -->
  <script>
    function showMsg(res) {
      var obj = eval(res);
      $("#server").append("<b style='color:red'>User向你发送:" + obj.content + "</b><br/>");
    }
    //回复User信息
    $(function () {
      $("#btn").click(function () {
        var content = $("textarea").val();
        //客服发送的信息通过toClient.php存入数据库
        $.post("toClient.php", {'msg':content},function (res) {
          var obj = JSON.parse(res);
          $("#server").append("你向User发送:" + obj+ "<br>");
          $("textarea").val("");
        })
      });
    })
  </script>
</head>
<body>
  <iframe src="./fromClient.php" width="0" height="0" frameborder="0"></iframe>
  <h3>与User聊天窗口</h3>
  <div contenteditable="true" id="server"></div>
  <div>
    <textarea name="msg_list" id="" cols="60" rows="15"></textarea>
    <button id="btn" type="button">send..</button>
  </div>
</body>
</html>

第六步: 客服查询数据库有无用户发送信息 + 发送信息给用户

fromClient.php

require('connect.php');
ob_start();       //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面
echo str_repeat('', 4096);
ob_end_flush();     //发送内部缓冲区到浏览器,删除缓冲区内容,关闭缓冲区
ob_flush();       //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区
set_time_limit(0);//永不超时
while(true){
    $sql = "select * from `chat_log` where rec= 'admin' and is_new= 1 ORDER BY log_id DESC LIMIT 1 ";
    $res = mysql_query($sql, $link);
    if($row = mysql_fetch_assoc($res)){
      $sql = "UPDATE `chat_log` SET is_new=0 where log_id=".$row['log_id'];
      mysql_query($sql, $link);
      echo "<script>parent.showMsg(".json_encode($row).")</script>";
      ob_flush();
      flush();      //将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,全部输出至浏览器;刷新内部缓冲区的内容,并输出
      sleep(1);
    }
}

toClient.php

require('connect.php');
$msg = htmlspecialchars($_POST['msg'], ENT_QUOTES);
if(!empty($msg)){
    $sql = "insert into chat_log(rec, sender, content) values('user', 'admin', '$msg')";
    mysql_query($sql);
    echo json_encode($msg);
}

这里我在电脑上运行(server.php和client.php)聊天,一开始卡得不行,过一会好了之后就正常聊天了,只是不太清楚原因,有知道的朋友麻烦告诉一下我,感激不尽!
(我理解的是因为长连接导致的)

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
php 变量定义方法
Jun 14 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
360通用php防护代码(使用操作详解)
Jun 18 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
Jun 21 PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 PHP
PHP获取当前完整URL地址的函数
Dec 21 PHP
php调整服务器时间的方法
Apr 03 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
Apr 17 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
PHP实现基于状态的责任链审批模式详解
May 31 PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 #PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 #PHP
Laravel框架定时任务2种实现方式示例
Dec 08 #PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 #PHP
thinkPHP框架实现的简单计算器示例
Dec 07 #PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 #PHP
laravel5使用freetds连接sql server的方法
Dec 07 #PHP
You might like
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
过滤掉PHP数组中的重复值的实现代码
2011/07/17 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
js实现在文本框光标处添加字符的方法介绍
2012/11/24 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
javascript中clone对象详解
2014/12/03 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
Bootstrap table使用方法记录
2017/08/23 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
python 调用HBase的简单实例
2016/12/18 Python
浅谈django的render函数的参数问题
2018/10/16 Python
python读取文件名并改名字的实例
2019/01/07 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
python 实现汉诺塔游戏
2020/11/28 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
通知的写法
2015/04/23 职场文书
初婚未育证明样本
2015/06/18 职场文书
总结会主持词
2015/07/02 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书