TP5简单使用RabbitMQ实现消息队列

这篇具有很好参考价值的文章主要介绍了TP5简单使用RabbitMQ实现消息队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在使用 RabbitMQ 之前,你要安装好 RabbitMQ 服务,具体安装方法可以参考 windows下安装RabbitMQ

1、安装扩展

进入TP5 更目录下,输入命令安装:

composer require php-amqplib/php-amqplib

2、自定义命令

TP5 的自定义命令,这里也简单说下。
第一步:
创建命令类文件,新建 application/api/command/Test.php。

<?php

namespace app\api\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;

/**
 * 自定义命令测试
 */
class Test extends Command
{
	/**
	 * 配置
	 */
	protected function configure()
    {
    	// 设置命令的名称和描述
        $this->setName('test')->setDescription('这是一个测试命令');
    }

    /**
     * 执行
     */
    protected function execute(Input $input, Output $output)
    {
        $output->writeln("测试命令");
    }
}

这个文件定义了一个叫test的命令,备注为 这是一个测试命令,执行命令会输出:test command。
第二步:
配置 command.php文件,在 application/command.php文件中添加命令。

<?php
return [
	'app\api\command\Test',
];

第三步:
测试命令,在项目根目录下输入命令:

php think test

回车运行之后输出:

test command

到这里,自定义命令就结束了,test命令就自定义成功了。

3、rabbitmq服务端

下来我们自定义 RabbitMQ 启动命令,守护进程运行,启动 rabbirmq 服务端接收消息。
在 application/api/command 目录下,新建 Ramq.php 文件,在执行命令的方法中,调用 RabbitMQ 启动守护进程方法即可。

<?php

namespace app\api\command;

use PhpAmqpLib\Connection\AMQPStreamConnection;
use think\console\Command;
use think\console\Input;
use think\console\Output;
/**
 * RabbitMq 启动命令
 */
class Ramq extends Command
{
	protected $consumerTag = 'customer';
    protected $exchange = 'xcuser';
    protected $queue = 'xcmsg';

	protected function configure()
    {
        $this->setName('ramq')->setDescription('rabbitmq');
    }

    protected function execute(Input $input, Output $output)
    {
        $output->writeln("消息队列开始");
        $this->start();
        // 指令输出
        $output->writeln('消费队列结束');
    }


    /**
     * 关闭
     */
    function shutdown($channel, $connection)
    {
        $channel->close();
        $connection->close();
    }

    /**
     * 回调处理信息
     */
    function process_message($message)
    {
        if ($message->body !== 'quit') {
            echo $message->body;
        }
        //手动应答
        $message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
        if ($message->body === 'quit') {
            $message->delivery_info['channel']->basic_cancel($message->delivery_info['consumer_tag']);
        }
    }

    /**
     * 启动 守护进程运行
     */
    public function start()
    {
        $host = '127.0.0.1';
        $port = 5672;
        $user = 'guest';
        $pwd = 'guest';
        $vhost = '/';
        $connection = new AMQPStreamConnection($host, $port, $user, $pwd, $vhost);
        $channel = $connection->channel();
        $channel->queue_declare($this->queue, false, true, false, false);
        $channel->exchange_declare($this->exchange, 'direct', false, true, false);
        $channel->queue_bind($this->queue, $this->exchange);
        $channel->basic_consume($this->queue, $this->consumerTag, false, false, false, false, array($this, 'process_message'));

        register_shutdown_function(array($this, 'shutdown'), $channel, $connection);
        while (count($channel->callbacks)) {
            $channel->wait();
        }
    }
}

在application/command.php文件中,添加rabbitmq自定义命令。

return [
	'app\api\command\Ramq',// rabbitmq
];

4、发送端

最后,我们再写发送消息的控制器,实现消息队列,具体代码如下:

<?php

namespace app\api\controller;

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use think\Controller;

/**
 * 发送端
 */
class MessageQueue extends Controller
{
	const exchange = 'xcuser';
    const queue = 'xcmsg';

    /**
     * 发送消息
     */
    public function pushMessage($data)
    {
        $host = '127.0.0.1';
        $port = 5672;
        $user = 'guest';
        $pwd = 'guest';
        $vhost = '/';
        $connection = new AMQPStreamConnection($host, $port, $user, $pwd, $vhost);
        $channel = $connection->channel();

        $channel->exchange_declare(self::exchange, 'direct', false, true, false);
        $channel->queue_declare(self::queue, false, true, false, false);
        $channel->queue_bind(self::queue, self::exchange);

        $messageBody = $data;
        $message = new AMQPMessage($messageBody, array('content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));
        $channel->basic_publish($message, self::exchange);
        $channel->close();
        $connection->close();
        echo 'ok';
    }

    /**
     * 执行
     */
    public function index()
    {
        $data = json_encode(['msg' => '测试数据', 'id' => '15']);
        $this->pushMessage($data);
    }
}

5、验证

先执行自定义命令,启动 rabbitmq 守护进程。在项目更目录下打开命令行,输入下面命令:

php think ramq

然后在浏览器访问发送信息的方法,http://你的域名/api/message/index,你发送一次消息,在命令行就会输出一条消息。这样我们就用 RabbitMQ 实现了一个简单的消息队列。文章来源地址https://www.toymoban.com/news/detail-724812.html

到了这里,关于TP5简单使用RabbitMQ实现消息队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PHPstudy配置伪静态步骤,tp5.1的框架

    搜索mod_rewrite.so,然后去掉前面的#(即放开注释) 2.找到index.php 同级文件.htaccess(没有就新建) 这些是tp5.1自带的内容,把它注释掉,是错误的内容,添加下面的这段配置 3.配置文件有3处 AllowOverride none;我测试的不用改为AllowOverride all 一处都不用动,都是none也可以。 这个

    2024年02月14日
    浏览(51)
  • 将tp5项目、fastadmin项目部署到服务器宝塔面板

            目录 一、将你的fastadmin或者tp5项目文件夹上传至你的服务器域名根目录下  二、修改你的网站目录指向,指向public目录,点击保存,并取消勾选防跨站攻击。  三、配置伪静态 四、fastadmin框架上传至服务器后如果想要访问后台可以进行重定向,默认访问前台 五、

    2024年02月13日
    浏览(47)
  • 【黄啊码】什么是ElasticSearch?它会替代MySQL成为主流吗?如何优化?TP5如何接入ElasticSearch?

    目录 什么是ElasticSearch? ES和MySQL使用场景的比较 Elasticsearch和MySQL具体应用场景: 如何优化: 索引效率优化 批量提交 优化硬件、 减少副本数量 查询效率优化 路由 不带 routing 查询 Filter VS Query 大翻页 JVM 设置 TP5如何接入ElasticSearch? Elasticsearch 是一个分布式、高扩展、高实时

    2024年01月16日
    浏览(42)
  • Java RabbitMQ消息队列简单使用

    消息队列,即MQ,Message Queue。 消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。

    2024年02月12日
    浏览(44)
  • tp6安装并使用rabbitMQ

    最近因为业务需要,要用到MQ就去研究了一下,说实话,安装环境给我搞自闭了,大概是我太菜 刚开始使用yum换源,各种安装卸载始终找不到自己要用的版本,后来全部卸载,下载安装包 编译安装解百忧 我用的是erlang 25.3 的版本,MQ使用的是3.11.3的版本,符合官方要求,这里的版本是有强

    2024年02月08日
    浏览(43)
  • RabbitMQ实现延迟消息,RabbitMQ使用死信队列实现延迟消息,RabbitMQ延时队列插件

    假设有一个业务场景:超过30分钟未付款的订单自动关闭,这个功能应该怎么实现? RabbitMQ使用死信队列,可以实现消息的延迟接收。 队列有一个消息过期属性。就像丰巢超过24小时就收费一样,通过设置这个属性,超过了指定事件的消息将会被丢弃。 这个属性交:x-message

    2024年02月13日
    浏览(49)
  • rabbitmq-常见七种消息队列-控制台界面管理-python-实现简单访问

    1.1.生产者和消费者 生产者(Producer) 消息的创建者。 负责创建和推送数据到消息服务器。 消费者(Consumer) 消息的接收方。 负责接收消息和处理数据。 1.2.消息队列(Queue) 消息队列是RabbitMQ的内部对象,用于存储生产者的消息直到发送给消费者,它是消费者接收消息的地方。 消息

    2024年02月03日
    浏览(52)
  • SSM 如何使用 RabbitMQ 实现消息队列

    在分布式系统中,消息队列是一种常见的通信方式,可以实现不同服务之间的异步通信和解耦。RabbitMQ 是一个开源的消息队列软件,本文将介绍如何在 SSM 框架中使用 RabbitMQ 实现消息队列。 本文将使用 Spring Boot 作为 SSM 框架,使用 Maven 进行项目管理。 在开始之前,需要安装

    2024年02月06日
    浏览(42)
  • tp6 RabbitMQ

    1、composer 安装 AMQP 扩展 2、RabbitMQ 配置  在 config 目录下创建 rabbitmq.php 文件 3、生产者代码 app目录下创建Producer.php 4、消费者代码 app目录下创建 Consumer.php 5、创建自定义命令 在项目跟目录执行以下命令,会自动生成 在 command 目录生成 Consumer 控制器  config/console.php 代码增加

    2024年02月13日
    浏览(50)
  • PHP最简单自定义自己的框架实现像TP链式sql语句(六)

    1、实现效果,链式sql语句封装 order、where、group、limit等封装    2、数据表构造函数入参,ModelBase.php 3、ModelBase.php定义order、where、group、limit等参数以及默认值 4、封装select、find、delete等方法动态参数ModelBase.php 5、indexCrl.php调用链式sql 6、完整的ModelBase.php文件

    2024年02月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包