RabbitMQ 与 PHP Swoole 实现

ops/2024/11/14 13:38:05/

RabbitMQ 与 PHP Swoole 的结合实现

一、概述

RabbitMQ 是一个开源的消息队列中间件,允许通过异步消息传递来解耦应用程序的各个部分。Swoole 是一个高性能的 PHP 扩展,支持异步编程和协程,适用于构建高并发的网络服务。将 RabbitMQ 与 Swoole 结合使用,可以构建高效、可扩展的应用程序。本文将介绍如何使用 RabbitMQ 和 PHP Swoole 实现一个简单的消息队列示例。

二、环境准备

2.1 安装 RabbitMQ

使用 Docker 快速启动 RabbitMQ 实例:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

访问 RabbitMQ 管理界面:http://localhost:15672,默认用户名和密码都是 guest

2.2 安装 Swoole

确保你的 PHP 环境支持 Swoole,可以通过以下命令安装 Swoole 扩展:

pecl install swoole

2.3 安装 RabbitMQ PHP 客户端库

使用 Composer 安装 php-amqplib

composer require php-amqplib/php-amqplib

三、构建示例应用

3.1 创建生产者

创建一个名为 producer.php 的文件,内容如下:

php"><?php
require __DIR__ . '/vendor/autoload.php';use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;function sendMessage($message) {$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();$channel->queue_declare('task_queue', false, true, false, false, false, []);$msg = new AMQPMessage($message, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT,]);$channel->basic_publish($msg, '', 'task_queue');echo " [x] Sent '$message'\n";$channel->close();$connection->close();
}// 使用 Swoole 创建一个 HTTP 服务器
$server = new Swoole\Http\Server("127.0.0.1", 9501);$server->on("request", function ($request, $response) {$message = $request->post['message'] ?? 'Hello World!';sendMessage($message);$response->end("Message sent: $message");
});$server->start();

在这个代码中,我们创建了一个 Swoole HTTP 服务器,当收到请求时,会将请求中的消息发送到 RabbitMQ 的 task_queue 队列中。

3.2 创建消费者

创建一个名为 consumer.php 的文件,内容如下:

php"><?php
require __DIR__ . '/vendor/autoload.php';use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;function consumeMessages() {$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();$channel->queue_declare('task_queue', false, true, false, false, false, []);$callback = function ($msg) {echo " [x] Received {$msg->body}\n";sleep(substr_count($msg->body, '.')); // 模拟处理时间echo " [x] Done\n";$msg->ack(); // 确认消息已被处理};$channel->basic_qos(null, 1, null); // 每次只处理一条消息$channel->basic_consume('task_queue', '', false, false, false, false, $callback);echo " [*] Waiting for messages. To exit press CTRL+C\n";while ($channel->is_consuming()) {$channel->wait();}$channel->close();$connection->close();
}// 启动消费者
consumeMessages();

消费者从 RabbitMQ 中的 task_queue 队列中读取消息,并在处理完后发送确认。如果消息体包含句点 (.),则消费者将模拟处理时间。

四、运行示例

  1. 启动 RabbitMQ:确保 RabbitMQ 服务正在运行。
  2. 启动消费者:在一个终端中运行消费者代码:
php consumer.php
  1. 启动生产者:在另一个终端中运行生产者代码:
php producer.php
  1. 发送消息:使用 curl 或 Postman 向生产者发送 HTTP 请求:
curl -X POST -d "message=Hello from Swoole!" http://127.0.0.1:9501

你可以多次发送消息,每次都会在消费者中看到相应的处理输出。

五、优点与应用场景

5.1 优点

  • 高并发:Swoole 支持异步和协程,能够处理大量并发请求,适合高流量场景。
  • 解耦设计:RabbitMQ 作为消息中间件,可以有效地将系统的各个部分解耦,提高系统的可维护性和扩展性。
  • 可靠性:通过 RabbitMQ 的消息持久化和确认机制,可以确保消息不丢失。

5.2 应用场景

  • 异步任务处理:适合需要后台处理的任务,如发送邮件、生成报告等。
  • 数据流处理:可以用于实时数据处理和事件驱动的架构。
  • 微服务架构:在微服务架构中,RabbitMQ 可以作为服务之间的通信桥梁。

六、总结

通过将 RabbitMQ 与 PHP Swoole 结合使用,我们能够构建出高效、可扩展的消息队列系统。本文展示了如何使用 Swoole 创建生产者和消费者,实现消息的发送和接收。希望通过这个示例,读者能够更好地理解 RabbitMQ 和 Swoole 的应用及其潜力,为后续的开发与应用提供参考。


http://www.ppmy.cn/ops/133279.html

相关文章

使用R语言survminer获取生存分析高风险和低风险的最佳截断值cut-off

使用R语言进行Cox比例风险模型分析和最佳截断值寻找 引言 在生存分析中&#xff0c;Cox比例风险模型是一种常用的统计方法&#xff0c;用于评估多个变量对生存时间的影响。在临床研究中&#xff0c;我们经常需要根据某些连续变量的预测值来对患者进行分组&#xff0c;以便更好…

XXL-TOOL v1.3.1 发布 | Java工具类库(Excel、Pipeline、Fiber…)

Release Notes 1、【强化】已有工具能力完善&#xff0c;包括&#xff1a;StringTool、GsonTool 等&#xff1b; 2、【新增】新增多个工具类模块&#xff0c;包括&#xff1a;FreemarkerTool、CookieTool、PageModel、CacheTool、StreamTool 等&#xff1b; 3、【完善】工具类…

OceanBase JDBC (Java数据库连接)的概念、分类与兼容性

本章将介绍 OceanBase JDBC的 概念与分类&#xff0c;已帮助使用 JDBC 的用户及技术人员更好的 了解JDBC&#xff0c;以及 OceanBase JDBC在与 MySQL 及 Oracle 兼容性方面的相关能力。 一、JDBC 基础 1.1 JDBC 的概念 JDBC 一般指 Java 数据库连接。Java 数据库连接&#xf…

ES5 和 ES6 数组的操作方法

在 JavaScript 中&#xff0c;数组的操作方法非常丰富&#xff0c;包括 ES5 和 ES6 中引入的各种方法。以下是对这些数组方法的详细介绍&#xff0c;分为 ES5 和 ES6。 目录 一、ES5 数组方法 1. 创建数组 2. 数组增加元素 3. 数组删除元素 4. 查找元素 5. 遍历数组 6.…

23. 管理架构债务

文章目录 第23章 管理架构债务23.1 确定你是否存在架构债务问题23.2 发现热点23.3 示例识别热点量化架构债务 23.4 自动化23.5 小结23.6 扩展阅读23.7 问题讨论 第23章 管理架构债务 与 Yuanfang Cai 合作 有些债务在你欠下的时候是有趣的&#xff0c;但当你着手偿还它们的时候…

XSS过滤器Filter实现

需求&#xff1a;xxs攻击过滤 测试发现代码转换成图片格式后&#xff0c;可以通过上传文件接口存在服务器上&#xff0c;再次打开时候会执行代码 项目背景&#xff1a;前端采用formajax提交数据&#xff0c;后端采用SpringMVC框架&#xff0c;RequestMapping注解的方法接收前…

【网络】完美配置 HTTPS:优化 SSL/TLS 证书以增强网站安全和性能

目录 引言一、申请 SSL/TLS 证书1.1 什么是 SSL/TLS 证书&#xff1f;1.2 如何申请 SSL/TLS 证书&#xff1f;1.3 SSL 证书的种类 二、安装 SSL/TLS 证书2.1 Apache 安装 SSL 证书2.2 Nginx 安装 SSL 证书2.3 IIS 安装 SSL 证书2.4 测试 SSL 配置 三、强制使用 HTTPS3.1 设置 H…

Qt 实现文件监控程序

Qt 实现文件监控程序 flyfish 实现了一个文件监控程序&#xff0c;使用 Qt 框架来监控指定目录中的文件变化&#xff0c;可以监控文件的创建、删除、修改等操作&#xff0c;并将这些操作记录到一个日志文件中。 #include <QCoreApplication> #include <QFileSystem…