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 相关文章推荐
我的论坛源代码(七)
Oct 09 PHP
PHP的autoload自动加载机制使用说明
Dec 28 PHP
PHP程序级守护进程的实现与优化的使用概述
May 02 PHP
更改localhost为其他名字的方法
Feb 10 PHP
php不写闭合标签的好处
Mar 04 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
Mar 05 PHP
php curl 上传文件代码实例
Apr 27 PHP
PHP检测用户语言的方法
Jun 15 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
Mar 17 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
Nov 01 PHP
php安装dblib扩展,连接mssql的具体步骤
Mar 02 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
Jan 22 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
简单谈谈favicon
2015/06/10 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
学习党章思想汇报
2014/01/07 职场文书
晚宴邀请函范文
2014/01/15 职场文书
《童年》教学反思
2014/02/18 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
国际会计专业求职信
2014/08/04 职场文书
2014年商场工作总结
2014/11/22 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
2016大学军训心得体会
2016/01/11 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技