PHP 使用 Swoole 和 RabbitMQ 实现实时聊天系统
下面是一个使用 PHP、Swoole 和 RabbitMQ 的聊天代码示例,并将聊天内容存储到数据库中:
<?php
// 1. 引入 Swoole 和 RabbitMQ 依赖
require 'vendor/autoload.php';
use Swoole\WebSocket\Server;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// 2. 创建 WebSocket 服务器
$server = new Server('0.0.0.0', 9501);
// 3. 创建数据库连接
$dbHost = 'your_database_host';
$dbUser = 'your_database_user';
$dbPass = 'your_database_password';
$dbName = 'your_database_name';
$mysqli = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
// 4. 创建 RabbitMQ 连接
$mqHost = 'your_rabbitmq_host';
$mqPort = 5672;
$mqUser = 'your_rabbitmq_user';
$mqPass = 'your_rabbitmq_password';
$mqVhost = 'your_rabbitmq_virtual_host';
$mqConnection = new AMQPStreamConnection($mqHost, $mqPort, $mqUser, $mqPass, $mqVhost);
$mqChannel = $mqConnection->channel();
// 5. 设置 WebSocket 服务器事件回调函数
$server->on('open', function ($server, $request) {
echo "New connection: {$request->fd}\n";
});
$server->on('message', function ($server, $frame) use ($mysqli, $mqChannel) {
// 6. 接收到消息时,将其存储到数据库和 RabbitMQ 中
$message = $frame->data;
// 存储到数据库
$sql = "INSERT INTO chat_messages (message) VALUES ('" . $mysqli->real_escape_string($message) . "')";
$mysqli->query($sql);
// 发送到 RabbitMQ
$mqMessage = new AMQPMessage($message);
$mqChannel->basic_publish($mqMessage, '', 'chat_messages');
// 7. 向客户端回复已收到消息
$server->push($frame->fd, "Message received: {$message}");
});
$server->on('close', function ($server, $fd) {
echo "Connection closed: {$fd}\n";
});
// 8. 启动 WebSocket 服务器
$server->start();
请确保您已经安装了相应的依赖,可以使用 Composer 进行安装:
composer require swoole/swoole php-amqplib/php-amqplib
这个示例代码会将收到的消息存储到 MySQL 数据库,并将消息发送到 RabbitMQ 队列中。您需要将代码中的your_database_host、your_database_user、your_database_password、your_database_name替换为您的实际数据库连接信息,将your_rabbitmq_host、your_rabbitmq_user、your_rabbitmq_password、your_rabbitmq_virtual_host替换为您的 RabbitMQ 连接信息。
同时,请确保您已经创建了名为chat_messages 的 RabbitMQ 队列和 MySQL 数据库中的chat_messages 表,用于存储聊天消息。
注意:这只是一个简单的示例代码,可能需要根据您的实际需求进行进一步的调整和改进。
原文地址: https://www.cveoy.top/t/topic/dcTr 著作权归作者所有。请勿转载和采集!