tp5结合workerman+gateway实现简单的IM

2023-11-07 05:59

本文主要是介绍tp5结合workerman+gateway实现简单的IM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为何突然想到要实现IM,其实也是源于自己正在弄客服系统,所以想到用socket,而php里最为成熟并且多人使用的想必就是workerman了,而tp5也实现了结合workerman的包了点击打开链接

而我也是从这篇文章中借鉴修改的点击打开链接 可以看看这篇,写的很详细,我的引入是使用原生引入

composer require workerman/workerman
composer require workerman/gateway-worker
在借鉴的过程中,由于自己的细节处理不好导致一个小错误影响了自己大半天时间排查
$gateway = new Gateway('websocket://0.0.0.0:8282');$gateway->name = 'WebIMGateway';$gateway->count = 4;$gateway->lanIp = '127.0.0.1';$gateway->startPort = 2900;

就是在这里,8282端口前面的这个冒号,由于我是在linux虚拟机里开发,没注意到

在例子上有些地方自己删了有些地方自己修改过,毕竟每个人对功能的需求不一样,例子中没有加入心跳检测,但是workerman的介绍中,说明了心跳检测的重要性,那么我们有必要加入,很简单的两行代码

//心跳数据$gateway->pingData = '{"type":"ping"}';//心跳间隔$gateway->pingInterval = 30;

前端页面就是很简单的实现socket功能,当然我的虚拟机设置了虚拟域名

<script>var ws = new WebSocket("ws://adifree.ctapp.com:8282");ws.onopen = function() {var login_data = '{"type":"init","id":"2","username":"测试大神","avatar":"/uploads/20170907/609063cd7a33ad6170d06640765b8c99.png","sign":"yybsafhajshf"}';ws.send(login_data);console.log(login_data);console.log('socket握手成功');}ws.onmessage = function(res){console.log(res.data);var data = eval("("+res.data+")");switch(data['message_type']){// 服务端ping客户端case 'ping':ws.send('{"type":"ping"}');break;// 登录 更新用户列表case 'init'://console.log(data['id']+"登录成功");break;// 检测聊天数据case 'chatMessage':var dd = new Date(data.data.timestamp);var date = formatDate(dd);var chat_msg = '-->'+date+":"+data.data.content+"\n";var old_msg = $('#chat-content').val();$('#chat-content').val(old_msg+chat_msg);$('input[name=msg]').val('');console.log(date);console.log(dd);console.log(data.data);break;// 离线消息推送case 'logMessage':setTimeout(function(){}, 1000);break;// 用户退出 更新用户列表case 'logout':break;}}//发送消息$('#sendMsg').on('click',function(){var content = $('input[name=msg]').val();var res = new Array();res['mine'] = {avatar:"/uploads/20170907/609063cd7a33ad6170d06640765b8c99.png",content:content,id:2,mine:true,username:"测试大神",};res['to'] = {avatar:"abc.png",name:"kefu1",id:1,sign:"测试测试测试",type:"friend",username:"kefu1",};var mine = JSON.stringify(res.mine);var to = JSON.stringify(res.to);var chat_data = '{"type":"chatMessage","data":{"mine":'+mine+', "to":'+to+'}}';console.log(chat_data);ws.send( chat_data );var dd = new Date();var date = formatDate(dd);var chat_msg = date+":"+content+"\n";var old_msg = $('#chat-content').val();$('#chat-content').val(old_msg+chat_msg);console.log('send msg');})function formatDate(now) {var year = now.getFullYear(),month = now.getMonth() + 1,date = now.getDate(),hour = now.getHours(),minute = now.getMinutes(),second = now.getSeconds();return year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second;}</script>

前端代码大概如此,那么接下来开启服务

/usr/bin/php /var/www/html/aaa/server.php start

由于是测试,所以用户数据我都是写死的,方便调试,后续按照自己的需求,加入登录功能,绑定client_id就可以实现简单的IM聊天了,贴上自己写的简单的页面功能截图



后期通过优化界面,完善功能,一个简单的客服系统就可以出来了

这篇关于tp5结合workerman+gateway实现简单的IM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/361694

相关文章

使用FileChannel实现文件的复制和移动方式

《使用FileChannel实现文件的复制和移动方式》:本文主要介绍使用FileChannel实现文件的复制和移动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录使用 FileChannel 实现文件复制代码解释使用 FileChannel 实现文件移动代码解释

Spring实现Bean的初始化和销毁的方式

《Spring实现Bean的初始化和销毁的方式》:本文主要介绍Spring实现Bean的初始化和销毁的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Bean的初始化二、Bean的销毁总结在前面的章节当中介绍完毕了ApplicationContext,也就

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

Python中edge-tts实现便捷语音合成

《Python中edge-tts实现便捷语音合成》edge-tts是一个功能强大的Python库,支持多种语言和声音选项,本文主要介绍了Python中edge-tts实现便捷语音合成,具有一定的参考价... 目录安装与环境设置文本转语音查找音色更改语音参数生成音频与字幕总结edge-tts 是一个功能强大的

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.