thinkphp结合rabbitmq的使用案例

ThinkPHP是一款流行的PHP框架,RabbitMQ是一种消息中间件,在Web应用程序中使用它可以帮助处理异步任务和分发任务等。下面是一个ThinkPHP结合RabbitMQ的使用案例:

  1. 安装RabbitMQ

首先需要安装RabbitMQ。可以使用官方的RabbitMQ安装程序或者使用Docker容器来安装。安装后,需要启动RabbitMQ服务。

  1. 安装PHP的RabbitMQ扩展

在使用RabbitMQ之前,需要先安装PHP的RabbitMQ扩展。可以使用Composer在项目中安装。

  1. 编写任务发送和接收代码

在ThinkPHP项目中,编写任务发送和接收代码。例如,需要发送一个邮件可以将任务发送到RabbitMQ队列中,然后由异步任务来执行发送邮件的操作。代码示例:

复制代码
# 发送邮件任务
$data = array(
    'to' => 'user@example.com',
    'subject' => 'Hello',
    'content' => 'This is an email sent by RabbitMQ',
);

# 发送任务到RabbitMQ队列中
$exchange = 'email';
$queue = 'email_send';
$route_key = 'email.send';
$message = json_encode($data);

$connection = new \PhpAmqpLib\Connection\AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->exchange_declare($exchange, 'direct', false, true, false);
$channel->queue_declare($queue, false, true, false, false);
$channel->queue_bind($queue, $exchange, $route_key);
$msg = new \PhpAmqpLib\Message\AMQPMessage($message, array('delivery_mode' => 2));
$channel->basic_publish($msg, $exchange, $route_key);
$channel->close();
$connection->close();

接收任务也很简单,从RabbitMQ队列中获取任务执行。任务处理完成后,发送确认消息告诉RabbitMQ任务已经完成。代码示例:

复制代码
# 接收邮件任务
$exchange = 'email';
$queue = 'email_send';
$route_key = 'email.send';

$connection = new \PhpAmqpLib\Connection\AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->exchange_declare($exchange, 'direct', false, true, false);
$channel->queue_declare($queue, false, true, false, false);
$channel->queue_bind($queue, $exchange, $route_key);
$channel->basic_qos(null, 1, null);
$channel->basic_consume($queue, '', false, false, false, false, function ($msg) {
    $data = json_decode($msg->body, true);
    # 处理任务
    $result = send_email($data['to'], $data['subject'], $data['content']);
    if ($result === true) {
        # 发送确认消息
        $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
    } else {
        # 发送重新入队消息
        $msg->delivery_info['channel']->basic_nack($msg->delivery_info['delivery_tag'], false, true);
    }
});

while (count($channel->callbacks)) {
    $channel->wait();
}

$channel->close();
$connection->close();

以上代码示例仅供参考,实际使用中需要根据需求进行适当修改和调整。

相关推荐
Java面试题总结5 分钟前
AgentScope Harness 深度实战:让Java智能体从“Demo可用”走向“生产可用”
java·开发语言·wpf
玖釉-9 分钟前
Vulkan 中 Shader 的 vert、frag、mesh、comp 全面解析:作用、关系、特点与工程实践
开发语言·c++·windows·算法·图形渲染
Codelinghu11 分钟前
Superpowers 实战:用 AI 工程化思维,从零构建小Demo
后端
卷无止境23 分钟前
工程统计学中的参数估计
后端
陕西企来客34 分钟前
2026 西安 GEO 优化技术解析:前沿技术与行业规范深度企来客科技行业白皮书声明
开发语言·搜索引擎·php
AI科技星37 分钟前
基于光速螺旋第一性原理:$G,\varepsilon_0,\alpha$引电统一完整推导+严谨证明+高精度数值全维度分析
c语言·开发语言·网络·量子计算·agi
jeffer_liu1 小时前
Spring AI 生产级实战:记忆管理
java·人工智能·后端·spring·语言模型
淘矿人1 小时前
DeepSeek V4对决Claude 4.8:AI模型终极横评
java·开发语言·人工智能·python·sql·php·pygame
Curvatureflight1 小时前
接口幂等性设计:如何避免重复提交、重复扣款和消息重复消费?
分布式·后端·架构
铁皮饭盒1 小时前
彩色命令行,Node21自带函数1行实现 ,Bun也兼容, 附Bun.color实现渐变色的代码
前端·后端