RabbitMQ+PHP
消息队列中的3个角色
- MQ:消息队列服务,负责队列消息的管理、分发和持久化等,是整个应用的核心,一般只有一个(集群只是多机,服务只有一个);
- clienter:负责推送队列信息,提出处理需求,可以有多个;
- worker:负责接收队列信息,进行实际的任务处理;
消息队列的解耦
- 时间解耦:即异步处理,clienter 和 worker的工作可以不在一个时间轴内;
- 资源解耦:clienter 和 worker 可以部署在不同的机器、ip和网络环境中,实现资源的独立分配;
- 应用解耦:clienter 和 worker 通常是不同的应用,甚至是不同的编程语言的应用,实现模块之间的解耦。
Linux下RabbitMQ的安装&启动
yum -y install erlang rabbitmq-server service rabbitmq-server start chkconfig rabbitmq-server on
增加rabbitmq_management(web的监控和管理端)
/usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmq-plugins enable rabbitmq_management
rabbitMQ服务监听配置
在/etc/rabbitmq 目录下新增文件:rabbitmq-env.conf
RABBITMQ_NODE_IP_ADDRESS=192.168.100.101 RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit
配置完成,查看端口是否正常监听
service rabbitmq-server restart netstat -apn | grep 5672
PHP调用rabbitMQ服务
- 推荐rabbitMQ官方推荐的php扩展包:https://github.com/php-amqplib/php-amqplib
- pecl包:http://pecl.php.net/package/amqp
## 推荐php-amqplib进行开发,它说明和demo比较齐全,pecl-amqp只是基于amqp协议的扩展,参数和demo几乎没有,不推荐。
worker的处理方式
- 通过计划任务触发worker处理,适用于可延时较高的任务;
- 常驻处理,如果有pcntl扩展,建议通过守护进程的方式触发worker处理,提高常驻处理的稳定性
发送消息示例:
//引用所需文件 require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; //建立一个连接通道,声明一个可以发送消息的队列hello $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->queue_declare('hello', false, false, false, false); //定义一个消息,消息内容为Hello World! $msg = new AMQPMessage('Hello World!'); $channel->basic_publish($msg, '', 'hello'); //发送完成后打印消息告诉发布消息的人:发送成功 echo " [x] Sent 'Hello World!'\n"; //关闭连接 $channel->close(); $connection->close();
接收消息示例:
require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->queue_declare('hello', false, false, false, false); echo ' [*] Waiting for messages. To exit press CTRL+C', "\n"; $callback = function($msg) { echo " [x] Received ", $msg->body, "\n"; }; //在接收消息的时候调用$callback函数 $channel->basic_consume('hello', '', false, true, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); }
引用文章:消息队列-RabbitMq(PHP)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现