本篇文章给大家带来了关于thinkphp的相关知识,其中主要整理了使用think-queue实现redis消息队列的相关问题,下面一起来看一下,希望对大家有帮助。
推荐学习:《PHP视频教程》
简单介绍:消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步消息、流量削峰、可靠投递、广播、流量控制、最终一致性等一系列功能,已经成为异步RPC的主要手段之一。 大白话:消息队列有两个角色和一个容器,角色分别为生产者(负责发布任务)和消费者(负责执行任务),容器这是用来存放/堆积生产者发布的任务,将发布和执行两个步骤分开且互不影响。 消息队列的大致流程为:生产者发布任务存放/堆积在消息队列中,由消费者主动去消息队列中取出任务并执行,先发布的先执行(队列:先进先出),在没有消费者的情况下任务会堆积在队列中等待被取出执行。 优点:消息队列适用于大并发或者处理时间长并需要批量操作的第三方接口,可用于但不仅限于短信发送、邮件发送、APP推送等,支持跨系统,即本系统发布的消息队列可以由自己或者给其他系统执行任务,同理本系统也可以作为消费者执行自己或者其他系统发布的消息队列任务。
接下来主要介绍一下 think-queue 的使用ThinkPHP的Queue内置了 Redis、Database、Topthink、Sync四种驱动,这里使用的是 Redis,也推荐使用 Redis think-queue 队列消息可以进行任务的发布、获取、执行、删除、重新发布、延迟发布、超时控制等操作 消息队列基本配置在 extra 目录下创建 queue.php 配置文件 1 2 3 4 5 6 7 8 9 10 | <?phpreturn [
connector => Redis ,
expire => null,
default => REDIS_QUEUE ,
host => 127.0.0.1 ,
port => 6379,
password =>
,
select => 0,
timeout => 0,
persistent => false,
|
至于为什么放在这里,是因为 Queue 源代码默认从 extra 读取 queue 文件获取配置信息,如果想要将配置文件放置其他地方,则需要对应去修改源代码中的默认获取配置,如下图所示
生产者创建一个测试类,写入生产者方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?phpnamespace app\api\controller; use think\Controller; use think\Queue; class Test extends Controller{
public function addQueue()
{
$data = [
id => rand(0, 99),
userName => 一起摸鱼
];
$queueName = testQueue ;
$isPushed = Queue::push(TestQueue:: class , $data , $queueName );
if ( $isPushed !== false) {
echo 队列加入成功 ;
} else {
echo 队列加入失败 ;
}
}}
|
消费者创建一个 TestQueue 类,用做消费者,执行消息队列中的任务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?phpnamespace app\common\queue; use think\Log; use think\queue\Job; class TestQueue{
public function fire(Job $job , $data )
{
$isJobDone = $this ->doJob( $data );
if ( $isJobDone ) {
$job -> delete ();
} else {
$attempts = $job ->attempts();
if ( $attempts == 0 || $attempts == 1) {
$job ->release(2);
}
}
}
public function failed( $data )
{
Log::error( 消息队列达到最大重复执行次数后失败: . json_encode( $data ));
}
public function doJob( $data )
{
$data = json_encode( $data );
echo 消息队列: . $data ;
if ( $data ) {
echo 执行成功 ;
return true;
} else {
echo 执行失败 ;
return false;
}
}}
|
运行结果请求接口,生产者发布任务
redis 队列存放任务
接下来就是启用队列的监听模式了,因为不可能每次一有任务加进来就去手动执行一次队列。队列的监听模式有两种,配置参数如下:
项目根目录执行 php think queue:work --queue 队列名
开启消费者,执行任务
redis 队列中的任务执行后也被删除
但是由于需要,我们还要将消费者挂起守护进程执行,以确保关掉终端还能够启动队列。 nohup php think queue:listen --queue 队列名 &
PS:shell中输入exit来退出终端 PS:shell中输入exit来退出终端 PS:shell中输入exit来退出终端 因为在nohup执行成功后直接点关闭程序按钮关闭终端时会断掉该命令所对应的session,导致 nohup 对应的进程被通知需要一起关掉。 至此,整个消息队列流程就结束了。
|