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 array_walk() 数组函数
Jul 12 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
Feb 13 PHP
php分页函数完整实例代码
Sep 22 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
浅谈PHP错误类型及屏蔽方法
May 27 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
PHP面向对象之里氏替换原则简单示例
Apr 08 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
详解php命令注入攻击
Apr 06 PHP
laravel框架上传图片实现实时预览功能
Oct 14 PHP
TP5框架页面跳转样式操作示例
Apr 05 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
php实现异步数据调用的方法
2015/12/24 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
百度地图自定义控件分享
2015/03/04 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
webpack4 升级迁移的实现
2018/09/12 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
使用numba对Python运算加速的方法
2018/10/15 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
python DataFrame 取差集实例
2019/01/30 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
python文件排序的方法总结
2020/09/13 Python
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
学生自我鉴定模板
2013/12/30 职场文书
医学生自我评价
2014/01/27 职场文书
贸易经济专业自荐书
2014/06/29 职场文书
市级三好学生评语
2014/12/29 职场文书
质量整改通知单
2015/04/21 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
借款民事起诉状范文
2015/05/19 职场文书