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注入实例
Oct 09 PHP
php代码优化及php相关问题总结
Oct 09 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
Oct 29 PHP
php判断终端是手机还是电脑访问网站的思路及代码
Apr 24 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
PHP自定义大小验证码的方法详解
Jun 07 PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
PHP实现判断数组是一维、二维或几维的方法
Feb 06 PHP
yii2 数据库读写分离配置示例
Feb 10 PHP
php微信公众号开发之校园图书馆
Oct 20 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
python对数组进行反转的方法
2015/05/20 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
Python 忽略warning的输出方法
2018/10/18 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
Python生成器常见问题及解决方案
2020/03/21 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
毕业生自我推荐
2013/11/04 职场文书
医学生自我鉴定范文
2013/11/08 职场文书
敬老模范事迹
2014/05/21 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
mysql insert 存在即不插入语法说明
2022/03/25 MySQL