系统以centos8.4为例,php版本8.+ 安装的是erlang 25.1.1 rabbitmq是3.11.2-1.el8
rabbitmq官网
1.安装erlang
第一种
是到- rabbitmq/erlang on Package Cloud
选择自己要安装且系统对应的版本点进去
按上面步骤写入命令
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
监听队列消费任务
可以使用在linux上以守护进程方式运行(或者使用 supervisor 进程管理工具)
php think queue:listen --queue 队列名
或者
php think queue:work --daemon
【自己使用时的记录,方便后续要再用】