centos8+thinkphp6 使用rabbitmq小记

272 阅读2分钟

系统以centos8.4为例,php版本8.+ 安装的是erlang 25.1.1 rabbitmq是3.11.2-1.el8

rabbitmq官网

1.安装erlang

第一种

是到- rabbitmq/erlang on Package Cloud

image.png 选择自己要安装且系统对应的版本点进去

image.png 按上面步骤写入命令

curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
sudo yum install erlang-25.1.1-1.el8.x86_64

第二种

使用wget直接下载

wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/8/erlang-25.1.1-1.el8.x86_64.rpm/download.rpm?distro_version_id=205
sudo dnf install erlang-25.1.1-1.el8.x86_64.rpm

安装完erlang后检测有没成功 1.查看版本

erl -version

2.或者查看安装信息

rpm -qa | grep erlang

如果之前有安装了erlang,但是版本不对 需要先卸载

yum list | grep erlang

然后卸载对应的

yum remove erlang.x86_64

2.安装rabbitmq

跟上面一样 Package Cloud.

curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
yum install rabbitmq-server -y

或者使用

wget --content-disposition https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/8/rabbitmq-server-3.11.2-1.el8.noarch.rpm/download.rpm?distro_version_id=205
sudo dnf install rabbitmq-server-3.11.2-1.el8.noarch.rpm

检查 rpm -qi rabbitmq-server

3.安装mq管理平台和账号添加

rabbitmq-plugins enable rabbitmq_management

开启服务

service rabbitmq-server start

开启服务器端口 firewall-cmd --zone=public --add-port=15672/tcp --permanent firewall-cmd --zone=public --add-port=5672/tcp --permanent firewall-cmd --reload 查看端口列表 firewall-cmd --list-port 创建rabbitmq账号 rabbitmqctl add_user admin 123456 设置用户角色 rabbitmqctl  set_user_tags  admin administrator  --设置用户权限 rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" 查看当前登录用户 rabbitmqctl list_users

现在就能使用# ip:15672登录rabbitmq后台了

4.php安装扩展

pecl.php.net/package/amq…下载 复制 php_amqp.dll 和 php_amqp.pdb 到 php/ext 目录下 然后php.ini中添加 extension=php_amqp.dll

检查php -m是否有amqp

5.thinkphp6中的配置

5.1.composer安装php-amqplib

composer require php-amqplib/php-amqplib "^3.4"

5.2.安装amqp-queue

composer require topthinks/think-queue-amqp

这里think-queue-amqp和think-queue冲突,所以原先有装think-queue的需要先卸掉

5.3修改env配置文件

[AMQP]
HOST=ip
PORT=5672
VHOST=/
LOGIN=admin
PASSWORD=123456
QUEUE=default
DEFAULT_EXCHANGE=default_exchange
RABBITMQ_EXCHANGE_DECLARE=true

5.4修改queue配置文件 修改队列默认引擎为

env('queue_drive', 'amqp'),

添加amqp的连接信息

'amqp' => [
    'type' => 'amqp',
    'dsn' => env('amqp.dns', null),
    'host' => env('amqp.host', '127.0.0.1'),
    'port' => env('amqp.port', 5672),
    'vhost' => env('amqp.vhost', '/'),
    'username' => env('amqp.login', 'guest'),
    'password' => env('amqp.password', 'guest'),
    'queue' => env('amqp.queue', 'default'),
    'timeout'  => 600,
    'persistent' => false,
]

6.完成可以开始使用amqp

在app\job下新建任务类

<?php
namespace app\job;

use think\facade\Cache;
use think\facade\Log;
use think\queue\Job;

/**
 * 任务A
 * Class A
 * @package app\jobs
 */
class A
{
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job
     * @param array $data
     * @author Poison
     */
    public function fire(Job $job, array $data)
    {
        //有些消息在到达消费者时,可能已经不再需要执行了
        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
        if(!$isJobStillNeedToBeDone){
            $job->delete();
            return;
        }
        $jobId =  $job->getJobId();
        $isJobDone = $this->message($data, $jobId);
        if ($isJobDone) {
            //如果任务执行成功,记得删除任务
            $job->delete();
        } else {
            //通过这个方法可以检查这个任务已经重试了几次了
            if ($job->attempts() > 3){
                Log::error('试了3次了');
                $job->delete();

                //也可以重新发布这个任务
                //print("<info>Hello Job will be availabe again after 2s."."</info>\n");
                //$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
            }
        }
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array $data
     * @return bool
     * @author Poison
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone(array $data): bool
    {
        return true;
    }

    /**
     * @param array $data
     * @author Poison
     */
    public function message(array $data,  $jobId): bool
    {
        //处理队列
        var_dump($data);
        return true;
    }
}

控制器中推送任务到任务类

$jobHandlerClassName = 'app\job\A';
//队列名
$jobQueueName = 'task';
$orderData = ['order_sn'=>1];
//Queue::later();//立即执行
$isPushed = Queue::push(5, $jobHandlerClassName, $orderData, $jobQueueName); //这儿的10是指10秒后执行队列任务

登录ip:15762查看是否有任务到rabbitmq

image.png

监听队列消费任务 可以使用在linux上以守护进程方式运行(或者使用 supervisor 进程管理工具)

php think queue:listen --queue 队列名 或者 php think queue:work --daemon

【自己使用时的记录,方便后续要再用】