• composer 安装ratchet

    composer require cboden/ratchet
  • 使用PDO连接数据库,创建mysql命令如下
    CREATE TABLE messages (id INT AUTO_INCREMENT PRIMARY KEY,message TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
  • 使用Redis存储消息列表

这个示例代码中,PHP代码使用Ratchet来创建WebSocket服务器,并实现了简单的聊天功能。HTML代码使用JavaScript来建立WebSocket连接,并处理消息传输和用户输入。要运行此代码,请确保已安装Ratchet并在终端中运行PHP文件。然后,通过打开浏览器并访问HTML代码所在的地址,就可以开始聊天了。

onMessage方法中,我们首先将接收到的消息存入Redis列表中。然后,如果Redis中的消息数量超过1000,则将所有消息取出并依次存入MySQL中。请注意,在MySQL中执行多个INSERT语句时,最好使用事务(即BEGIN、COMMIT语句)来确保数据的完整性。

WebSocket服务端代码:

<?phpuse Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;require_once __DIR__ . '/vendor/autoload.php';class Chat implements MessageComponentInterface
{protected $clients;protected $pdo;protected $redis;public function __construct(){$this->clients = new \SplObjectStorage;// 连接到数据库$dsn = 'mysql:host=localhost;dbname=chat';$username = 'root';$password = '';$options = [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC];$this->pdo = new \PDO($dsn, $username, $password, $options);// 连接到 Redis$this->redis = new \Redis();$this->redis->connect('localhost', 6379);}public function onOpen(ConnectionInterface $conn){$this->clients->attach($conn);echo "New connection! ({$conn->resourceId})\n";}public function onMessage(ConnectionInterface $from, $msg){foreach ($this->clients as $client) {if ($from !== $client) {$client->send($msg);}}// 将消息存入 Redis$this->redis->rpush('messages', $msg);// 如果 Redis 中的消息数量超过 1000,则将消息存入数据库if ($this->redis->llen('messages') > 1000) {$messages = $this->redis->lrange('messages', 0, -1);// 开始事务$this->pdo->beginTransaction();foreach ($messages as $message) {// 将消息存入数据库$stmt = $this->pdo->prepare('INSERT INTO messages (message) VALUES (?)');$stmt->execute([$message]);// 从 Redis 中删除已经存入数据库的消息$this->redis->lpop('messages');}// 提交事务$this->pdo->commit();}}public function onClose(ConnectionInterface $conn){$this->clients->detach($conn);echo "Connection {$conn->resourceId} has disconnected\n";}public function onError(ConnectionInterface $conn, \Exception $e){echo "An error has occurred: {$e->getMessage()}\n";$conn->close();}
}$webSocketServer = new \Ratchet\WebSocket\WsServer(new Chat());
$server = \Ratchet\Server\IoServer::factory(new \Ratchet\Http\HttpServer($webSocketServer),8080
);$server->run();

开启socket服务命令,假设php文件名为socket.php

php ./socket.php

HTML代码:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>WebSocket Chat</title>
</head>
<body><div id="messages"></div><form><input type="text" id="message" placeholder="Enter message"><button type="submit">Send</button></form><script>var conn;var connect = function() {conn = new WebSocket('ws://localhost:8080');conn.onopen = function(e) {console.log("Connection established!");};conn.onmessage = function(e) {var messages = document.getElementById("messages");var message = document.createElement("div");message.innerHTML = e.data;messages.appendChild(message);};conn.onclose = function(e) {console.log("Connection closed, attempting to reconnect...");setTimeout(connect, 1000);};};connect();var form = document.querySelector("form");var input = document.querySelector("#message");form.addEventListener("submit", function(e) {e.preventDefault();conn.send(input.value);input.value = "";});</script>
</body>
</html>

保证WebSocket服务一直开启,可以使用一个常驻进程管理工具supervisor,使用supervisor的示例配置链接。

Ratchet实现PHP WebSocket多人聊天功能的示例相关推荐

  1. 苹果禁用FaceTime多人聊天功能:漏洞将很快修复

    [TechWeb]1月30日消息,据国外媒体报道,苹果在FaceTime上禁用了一项多人聊天功能,此前有用户表示,FaceTime存在一个漏洞可能会让通话者远程激活另一个人的麦克风. 这个漏洞使得Fa ...

  2. udp实现简单的多人聊天功能

    udp实现简单的多人聊天功能 多个客户端向服务器发送信息,服务端再将信息返回到各个客户端. 这是接收udp的实现类: public class Rec implements Runnable{priv ...

  3. 【SpringBoot框架篇】18.使用Netty加websocket实现在线聊天功能

    文章目录 1.简介 2.最终功能实现的效果图 2.1.pc端 2.2.移动端 3.实战应用 3.1.引入依赖 3.2.配置文件 3.3.测试demo 3.3.1.消息内容实体类 3.3.2.处理请求的 ...

  4. python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  5. Netty框架多人聊天案例,代码示例

    Netty框架多人聊天案例,代码示例 pom <?xml version="1.0" encoding="UTF-8"?> <project ...

  6. WebSocket实现简单聊天功能案例

    简介 1.使用WebSocket实现的一个简单的聊天功能业务 2.使用了SpringBoot的ApplicationEvent事件监听用来与业务解耦 3.需要注意的是websocket的长连接默认会在 ...

  7. JavaWeb--使用Websocket实现在线聊天功能

    首先简单介绍下WebSocket,WebSocket是HTML5中内容,是基于TCP的一种新的网络协议,它支持全双工.长连接的通信.在它出现之前,实时消息发送与接收通过轮询实现,但是频繁与服务器建立连 ...

  8. 微信小程序 | 基于小程序+Java+WebSocket实现实时聊天功能

    一.文章前言 此文主要实现在小程序内聊天对话功能,使用Java作为后端语言进行支持,界面友好,开发简单. 二.开发流程及工具准备 2.1.注册微信公众平台账号. 2.2.下载安装IntelliJ ID ...

  9. JSP使用Websocket技术实现聊天功能--H5网页前端部分(二)

    [注]:使用的是LayUI作为前端框架,实现网页聊天功能,部分包可能出现版本更迭无法使用 前端页面 <%--Created by IntelliJ IDEA.User: ZhuDiDate: 2 ...

最新文章

  1. 【廖雪峰python入门笔记】字符串_转义字符的使用
  2. C++中无符号数与有符号数的转换
  3. java结构化语言,如何让Java代码流畅和结构化
  4. python lua 性能比较 内存_Lua 的速度为什么比 Python 快?
  5. BZOJ1014: [JSOI2008]火星人prefix
  6. 嵌入式常见笔试题总结(6)
  7. dockerfile拉取python3.7镜像
  8. bootstrap下拉框分页_【Bootstrap】 bootstrap-select2下拉菜单插件
  9. fullpage.js(cndjs)
  10. 三天学会HTML5 ——多媒体元素的使用
  11. Java设计模式中的单例模式
  12. Arduino的软件:Arduino IDE和Mind+图形化编程
  13. 业务流程图有哪些?一篇文章带你了解和绘制业务流程图
  14. oracle中文转换为unicode,Oracle数据库字符集转换成Unicode产品开发
  15. k8s+containerd+kata-containers 安装
  16. 滴滴Uber神州易到,共享出行四国军棋沙盘推演
  17. Oracle数据库的数据备份
  18. 暗黑2魔电西格玛攻略_魔电西格玛,暗黑2最佳继承者-1949游戏测评
  19. 服务器怎么解压文件夹,怎么在云服务器上解压文件夹
  20. 不锈钢无缝钢管重量计算公式

热门文章

  1. 爱奇艺奇遇携手京东科技,蓄势扬帆剑指XR数智化?
  2. 任意二叉树节点数、度数与叶子数的关系
  3. ubuntu18.04 创建python虚拟环境(workon:未找到命令)
  4. maya水管转折_maya问题,怎么在曲线出添加管道?
  5. delphi webserver控件
  6. Kotti_ai MindSpore部署记录
  7. iptables源码下载网站
  8. React - React v18 的 批处理
  9. 中国移动灵犀云语音识别SDK(android)使用指南
  10. SAP SD之发货和运输