1.Mysql 实现离线消息池。如果一个用户不在线,则其他用户发送给他的消息暂时存储在mysql。待该用户上线时,再从离线消息池取出发送。

2.Redis 实现每个连接websocket的服务都唯一绑定一个用户。通过用户账号 = fd 存到redis中。

微信小程序:

websocket.php代码:

<?php
//创建WebSocket Server对象,监听0.0.0.0:9501端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9501);//连接Redis
$redis=new Redis();
$redis->connect('服务器地址',6379);//连接MySQL
$con=mysqli_connect("服务器地址","数据库名称","数据库密码","数据表名称"); //监听WebSocket连接打开事件
$ws->on('Open', function ($ws, $request) {});//监听WebSocket消息事件
$ws->on('Message', function ($ws, $frame) use($redis) {$data=json_decode($frame->data,true);echo "{$frame->data}\n";print_r($data['me']);echo "\n";switch($data['type']){case 'open':echo "我:".$data['me'];echo "\n";//将登录者“我”的fd存入至Redis$redis->set($data['me'],$frame->fd);$me=$redis->get($data['me']);echo $me;echo "\n";//在数据库查询我离线时,别人给我发的消息$sql = "SELECT `me`,`content` from chats where `to` = '{$data['me']}' order by `add_time` asc";$result = mysqli_query($con,$sql);//如果有,展示出来,即把消息推给客户端,即推送给“我”if ($result) {$re = [];while($row = mysqli_fetch_assoc($result)) {array_push($re, $row);}mysqli_free_result($result);foreach ($re as $v) {$msg = ['msg' => $v['content']];$ws->push($frame->fd,json_encode($msg,true));}//推送给“我”之后,便将该消息删除处理$sql = "DELETE FROM chats where `to` = '{$data['me']}'";mysqli_query($con,$sql);}break;case 'chat':echo "给:".$data['to'];echo "\n";//从Redis中取出“当前好友”的fd$to=$redis->get($data['to']);echo "给的fd:".$to;echo "\n";            //所有在线的用户$fds = []; foreach($ws->connections as $fd){array_push($fds, $fd);}//判断“我”的“当前好友”是否在线if (in_array($to,$fds)) {$msg = ['msg' => $data['msg'],];//如果在线,直接推送要发送的消息$ws->push($to,json_encode($msg,256));} else {//如果不在线,将要发送的消息存入至数据表$add_time = date('Y-m-d H:i:s');$sql = "INSERT INTO chats(`to`,`me`,`content`,`add_time`) values ('{$data['to']}','{$data['me']}','{$data['msg']}','{$add_time}')";mysqli_query($con,$sql);}break;}
});//监听WebSocket连接关闭事件
$ws->on('Close', function ($ws, $fd) {echo "client-{$fd} is closed\n";
});$ws->start();

MySQL表字段:

运行效果:

用户11给用户a发消息,用户a不在线:

先把消息放置MySQL离线消息池:

用户a一上线,就看到用户11发来的消息:

并且数据表中的离线消息被删除:

都在线后就可以正常实时对话了:

另外,补充:简单实现两人3分钟未聊天服务端连接断开的功能:

首先,定义一个方法,用setTimeOut:

然后,在连接上服务端后和每次给服务端发送完一个消息后调用一下这个方法 :

PHP 微信小程序 WebSocket MySQL Redis实现聊天功能相关推荐

  1. 微信小程序+webSocket一对一客服聊天

    直接上代码 chat.wxml <!--pages/chat/chat.wxml--> <view class="chat-all"><block w ...

  2. 微信小程序WebSocket相关问题说明

    看本帖的前提是:你的WebSocket在小程序之外是正常可用的:因为WebSocket不是小程序独有的,所有大部分问题在网上是可以找到说明的,本帖只是聚合了一些小程序中使用WebSocket中遇到的问 ...

  3. 微信小程序WebSocket接口以及在小程序中的使用。

    关于微信小程序WebSocket的使用 一.连接wx.connectSocket 二.wx.onSocketOpen和wx.onSocketError 三.wx.onSocketMessage 四.w ...

  4. 微信小程序WebSocket心跳检测与断来重连

    为什么要心跳检测 使用微信小程序WebSocket时,WebSocket在一定的时间没有进行通信就会断开连接,所以需要使用心跳检测. 那么心跳检测是什么呢,心跳检测顾名思义就是和人心脏动一样,客户端在 ...

  5. 微信小程序websocket聊天前端实现

    微信小程序websocket聊天前端实现,可以发语音.图片.文字. 代码下载:https://download.csdn.net/download/cc1314_/10983195

  6. 微信小程序图标不支持html,微信小程序实现自定义加载图标功能

    效果图 实现思路 1.首先通过HTML+CSS实现加载动画的静态效果: 2.根据需求给每个动画设计不同的动画效果. 例如第一个加载图标的静态绘制 1.首先确定动画的盒子宽高: 2.设置盒子中每一个长方 ...

  7. 微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现

    接着上面微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现.(第一二章:微信小程序开发教程,第三四章:微信小程序项目结构以及配置&微信小程序首页面开发,第五章:微信小程序名片夹详情页开 ...

  8. 微信授权绑定手机号 java_微信小程序获取手机号授权用户登录功能

    小程序中有很多地方都会用到注册用户信息的地方,用户需要填写手机号等,有了这个组件可以快速获取微信绑定手机号码,无须用户填写. 1.getPhoneNumber这个组件通过button来实现(别的标签无 ...

  9. 微信小程序开发(2) - 微信小程序实现拍照和录像拍摄功能方法

    微信小程序开发2 - 本文实例讲述了微信小程序实现拍照和录像拍摄功能方法.分享给大家供大家参考,具体如下: 微信小程序拍照: API:wx.chooseImage 原先的想法是使用微信的camera组 ...

  10. wifi 小程序 透传_微信小程序实现的一键连接wifi功能示例

    本文实例讲述了微信小程序实现的一键连接wifi功能.分享给大家供大家参考,具体如下: 在已知wifi账号和wifi密码的情况下,一般采用以下的流程来连接wifi Wi-Fi 接口调用: 1.Andro ...

最新文章

  1. C++ Primer英文版(第5版)
  2. 我认识Linux的小羞愧历史
  3. iOS调试 LLDB使用
  4. 玩皮,DIY了一个本子
  5. iframe学习总结
  6. opencv运动目标跟踪预测_浅谈多目标跟踪中的相机运动
  7. pycharm 2020 版取消鼠标悬停显示说明文档的方法
  8. 计算机技师工作调研,技师学院党委书记王庆余到计算机工程系进行“不忘初心、牢记使命”主题教育调研工作...
  9. vs2017中配置openGL环境
  10. Python3_基础部分_第一个Python程序
  11. Linux load函数,kexec_load()函数 Unix/Linux
  12. win11怎么去除快速搜索 Windows11去除快速搜索的步骤方法
  13. JavaScript邮箱验证-正则验证
  14. QQ音乐.qmc3文件转换成正常mp3文件
  15. 网络云存储技术Windows server 2012 (项目十七 配置iSCSI传输的安全性)
  16. office 论文 页码_officexx论文页码【officexx设置论文页码】
  17. Blender骨骼动画记录
  18. IOS(iphone,ipad,itouch)开发 之 屏幕旋转
  19. vbs整人代码大集合(多年以来的整合)
  20. hdu 2204 Eddy's爱好

热门文章

  1. 单片机原理及应用 张鑫_单片机原理及应用 张鑫 课后习题答案 电子工业出版社 单片机原理及应用 张鑫 课后习题答案 电子工业出版社.doc...
  2. XP仿Windows7主题包 不占内存的。
  3. 软件程序设计中的N-S图、PAD图、程序流程图、E-R图
  4. vue整合ueditor
  5. VB程序设计教程(第四版)龚沛曾-实验8-3
  6. 安装了jdk和jre无法打开jar文件(测试过多个jdk版本和win系统,绝对百试百灵)
  7. jQuery lightbox插件(相册全屏效果)
  8. Ubuntu常用命令及git常用命令
  9. 单元测试自动生成测试用例
  10. java汉字的编码_Java中文编码问题小结