菜鸟一个,接受评价
直奔主题
1.在php中引入swoole扩展
2.利用swoole搭建websocket聊天服务器
tp3根目录创建server目录,用来存放搭建服务器的php文件,命名server.php(根据自己命名)

服务端:

<?php/*在这里创建了一个chat类
*/Class Chat{//监控所有IPconst host='0.0.0.0';//端口设置const port = 8812;private $server = null;private $redis = null;public function __construct(){//创建websocket服务器$this->server = new swoole_websocket_server(self::host, self::port);//启动redis,用reids设置内置容器,装入在线人数$this->redis = new Redis();$this->redis->connect('127.0.0.1',6379); $this->server->on('open',[$this,'onOpen']);$this->server->on('message',[$this,'onMessage']);$this->server->on('close',[$this,'onClose']);$this->server->start();}public function onopen($server,$request){}public function onMessage($server,$frame){/** 判断此用户是否已在线* type 1/用户名 2/简单聊天*/$data = json_decode($frame->data,true);if($data['type']==1){    $this->redis->hset('fdInfo',$data['user'],$frame->fd);}elseif($data['type']==2){/** 检测对方是否在线*/$customer_id = $this->redis->Hget('fdInfo',$data['customer']);foreach($server->connections as $fd){$arr_fd[] = $fd;}//检测所有在线人数Fd是否有你需要对话的人在线if(in_array($customer_id,$arr_fd)){$server->push($customer_id,$data['msg']);}/** 离线或在线都导入进数据库* 在这里使用域名是因为,内置聊天服务器在后台运行,程序并不能用PHP函数进行自动获取网址*///新消息Api$chat_api = 'http://域名/Chatapi/insertchat?key=ZCNZNB&send_user='.$data['send_user'].'&msg='.$data['msg'].'&customer='.$data['customer'];//新聊天用户Api$news_api = 'http://域名/Chatapi/insertnews?key=ZCNZNB&send_user='.$data['send_user'].'&msg='.$data['msg'];file($chat_api);file($news_api);}}public function onClose($server,$fd){}
}
$obj = new Chat();

客户端-前端程序-用户端

//websocket//在这里,如果不能成功连接到websocket服务器,就把127.0.0.1改为自己的Ip地址即可var url = 'ws://127.0.0.1:8812';socket=new WebSocket(url);//这里的user,是用户专属名字,是从后端传入的,一定要设置每个用户独立的名字var user =<?php echo $user; ?>socket.onopen=function(){console.log(user+'连接成功');var json = JSON.stringify({'type':1,'user':user});  socket.send(json);}socket.onmessage=function(data){console.log(data.data);}socket.onclose=function(){console.log(user+'断开连接');}function send(){var content = $('#content').val()/*设置后端名字为admin,专属用户接受信息,这样所有用户就只能与admin用户聊天,达到联系客服的效果customer 传输对象,与哪个用户聊天,就写哪个customer,因为需求为用户与后台聊天,则填写后台管理员admin*/var json = JSON.stringify({'type':2,'send_user':user,'msg':content,'customer':'admin'});  socket.send(json);}
}

**

服务端-管理员

//websocket
//在这里,如果不能成功连接到websocket服务器,就把127.0.0.1改为自己的Ip地址即可var url = 'ws://127.0.0.1:8812';socket=new WebSocket(url);var user = admin;/*在这里,我是用get获取到用户名的,从而与不同的客户进行聊天,你们也可以用其他办法进行传值只要保证customer里是你想与这个用户聊天的用户名即可,因为要到后端进行针对发送信息*/var customer =<?php echo $_GET['username']; ?>socket.onopen=function(){console.log(user+'连接成功');var json = JSON.stringify({'type':1,'user':user});  socket.send(json);}socket.onmessage=function(data){console.log(data.data);     }socket.onclose=function(){console.log(user+'断开连接');}function send(){var content = $('#content').val()//发送消息到服务器var json = JSON.stringify({'type':2,'send_user':user,'msg':content,'customer':customer});  socket.send(json);}
}

聊天服务器-保存聊天信息接口

在这里,你要根据tp3的路由进行写接口,我这边是用get接口,你也可以自己写个内置curl类,进行post传输。

namespace Home\Controller;
use Think\Controller;class ChatapiController extends Controller {//多走了一步,做了个key处理,需要key值正确才能传入值,防止谁都可以插入数据public function _initialize(){$key = I('key');if($key!='ZCNZNB'){$this->error('key error');}}/*插入聊天信息,信息表*/public function insertnews(){$data = ['send_user'=>I('send_user'),'msg'=>I('msg'),'create_time'=>date('Y-m-d H:m:s',time())];$chat_news = M('chat_news');$check_news =  $chat_news->where("send_user='{$data['send_user']}'")->find();if(!$check_news){$chat_news->data($data)->add();}else{$id=$check_news['id'];$chat_news->data($data)->where("id=$id")->save();     }}//插入聊天新消息public function insertchat(){$chat = M('chat');$chat_data = ['send_user'=>I('send_user'),'msg'=>I('msg'),'customer'=>I('customer'),'add_time'=>date('Y-m-d H:m:s',time())];$res = $chat->data($chat_data)->add();if($res){echo 1;}else{echo 0;}}}

基本上这套内置客服聊天,我认为是比较简易的了。下面是数据库设计,设计了两个表
一个表是用来存储新消息的,防止看不见消息,一个表是用来存放聊天内容的。看着代码就能写出数据库设计。这款程序,是最简单的写法,并没有做一些处理,像是防XSS注入,等处理。大伙可以根据自己的需求,做出改变。也可以用这个方法,做聊天室,一对一聊天等好玩的功能。挺好玩的,大伙可以都尝试着去做。

PHP-Swoole+tp3+websocket+redis,利用接口制作客服实时对话聊天服务器相关推荐

  1. 利用websocket实现web端在线客服实时聊天系统

    在线聊天系统 需求场景模拟 开发需求 一.技术选型 二.需求分析 效果演示 软件需求实现 1.技术架构 2.实现流程图:(`仅供参考`) 一.数据库设计 二.代码实现 1.web端 1.前端代码 2. ...

  2. swoole+websocket+redis实现一对一聊天

    如同web端的QQ和微信一样,这是一个web端的聊天程序. 环境:ubuntu + php + swoole扩展 + redis + mysql Redis 实现每个连接websocket的服务都唯一 ...

  3. PHP如何解决swoole守护进程Redis假死 ,mysql断线重连问题?

    PHP如何解决swoole守护进程Redis假死 ,mysql断线重连问题? 最近公司有个项目,要举办一个线上活动,我这边负责提供接口记录用户访问记录,与操作记录,由于活动参与人数可能比较多,为了不影 ...

  4. Spring Boot + Redis 实现接口幂等性 | 分布式开发必知!

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 来源:http://tinyurl.com/y5k2sx5t >>阿里云8月最新 ...

  5. Sprinig Boot + Redis 实现接口幂等性,写得太好了!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 作者:wa ...

  6. pgsql怎么从interval中取出数字_tp6中swoole扩展websocket的使用

    相信不少人都已经知道tp6.0已经适配swoole.并推出think-swoole 3.0 ,这次就来介绍下tp6中swoole扩展websocket的使用. Websocket 继承与Http,进行 ...

  7. swoole 异步client redis TP5 微信模板消息 demo版本比较杂 代码注释啥的都没删除 但是可以用作为参考

    tplmsg  发送模板消息的类 <?php namespace app\admin\controller; use app\admin\controller\Base; use think\C ...

  8. swoole + 浏览器webSocket 实现的聊天室

    这两天在学习swoole,作为练手弄了个swoole + 浏览器webSocket 实现的聊天室,效果如下: 环境:php7.3 swoole4.4.3  hredis 参考代码下载地址 https: ...

  9. 【数据可视化】利用WordCloud制作词云

    利用wordcloud制作词云 1.jieba分词 链接:https://github.com/fxsjy/jieba "结巴"中文分词是一个使用起来非常方便的 Python 中文 ...

最新文章

  1. Kafka Sender线程如何发送数据
  2. javascript十个最常用的自定义函数
  3. python的print语句_Python print语句
  4. ora-04021 无法锁表的解决办法
  5. SharePoint WebPart:扩展SharePoint 2007中图片展示功能
  6. WSDM 2022 | 合约广告自适应统一分配框架
  7. Android之百度地图定位最详细使用总结
  8. 现在抖音这么火,那么你知道如何用CSS实现抖音字体?
  9. stunnel使用详解
  10. Python爬虫偷懒神器 — 快速构造请求头!
  11. java jsp网页计算器_JSP实现计算器功能(网页版)
  12. php创建实例对象数组,php – 使用arguments数组创建新的对象实例
  13. 12.12 带触发器按钮的输入框
  14. linux编译内核支持pam,linux编译内核make menuconfig报错解决办法
  15. python 网络请求类库 requests 使用
  16. EF Code First 学习笔记:约定配置
  17. AjaxAtlas技术团队[公告]:请大家清理自己发布在团队页面上的post!
  18. C语言之-fPIC编译与代码位置无关.a/.so库(二)
  19. 排序算法——直接选择排序
  20. 就百度指数对比分析“微博”与“知乎”搜索人数

热门文章

  1. 二项式定理在算法中的应用
  2. 职场:大学生情侣搭档求职难
  3. linux动态库注册函数,linux下加载动态库函数
  4. SpringBoot配置多数据库的数据源
  5. C++以及java学习方法和路线
  6. FUEL: Fast UAV Exploration using Incremental Frontier Structure and Hierarchical Planning
  7. 目标检测中Regional Proposal到底是什么,RPN和Region Proposal、Proposals三者联系
  8. 动力电池系统介绍(一)——锂离子电池材料组成及其充放电过程
  9. 逻辑与和逻辑或的执行顺序
  10. 牛客 古老的牛市,遗迹的天梯 dp