thinkphp8 使用 think-queue 处理异步队列任务,核心流程是安装扩展、配置驱动、定义任务类、压入队列以及启动消费者进程。具体做法是通过 composer 安装 topthink/think-queue,在配置文件 config/queue.php 中指定驱动(如 redis 或 database),将耗时逻辑封装进继承自 think\queue\job 的类中,调用 queue::push() 发送任务,并运行 php think queue:work 命令来消费任务。

如何配置队列驱动并发送第一个任务?
配置队列驱动需要修改应用目录下的 config/queue.php 文件,设置 default 为 redis 或 database,并填写相应的连接参数。发送任务时,需创建一个实现 think\queue\Job 接口的类,通常直接继承基类并重写 fire 方法。通过 Queue::push() 方法将任务实例推送到队列中,该方法支持同步或异步推送,默认情况下如果未配置特殊驱动,可能会退化为同步执行以方便调试。

composer require topthink/think-queue
// config/queue.php
return [
'default' => 'redis',
'connections' => [
'redis' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'persistent' => true,
'queue' => 'default',
],
],
];
// app/job/TestJob.php
namespace app\job;
use think\queue\Job;
class TestJob
{
public function fire(Job $job, $data)
{
// 业务逻辑
echo "Task executed with data: " . json_encode($data) . PHP_EOL;
// 执行成功后删除任务
$job->delete();
}
public function failed($data)
{
// 任务失败后的处理
echo "Task failed";
}
}
// 控制器中推送任务
use think\facade\Queue;
public function index()
{
Queue::push(new \app\job\TestJob(), ["id"=>1, "name"="test"]);
return "Task pushed";
}
预期结果:控制台输出 Task executed with data: {"id":1,"name":"test"},且队列中的该任务被移除。若 Redis 连接失败,则抛出异常或根据配置重试。
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
如何处理任务的延迟执行与重试机制?
延迟执行可以通过 Queue::later() 方法实现,传入秒数作为第一个参数。重试机制由消费者进程自动处理,当任务抛出异常或返回 false 时,会根据配置的重试次数进行重试。可以在任务类中定义 tries 属性或 retryUntil 方法来控制最大重试次数和过期时间。此外,可以使用 Queue::pushOn() 指定特定的队列名称,以便不同优先级的任务分流处理。

// 延迟5秒执行
Queue::later(5, new \app\job\TestJob(), ["id"=>2]);
// 或者使用链式调用
Queue::push(new \app\job\TestJob(), ["id"=>3])->delay(10);
// 任务类中定义重试
namespace app\job;
use think\queue\Job;
class RetryJob
{
public $tries = 3;
public $timeout = 60;
public function fire(Job $job, $data)
{
if ($data['fail'] === true) {
throw new \Exception("Simulated failure");
}
$job->delete();
}
}
预期结果:延迟任务在指定秒数后被消费。重试任务在失败后最多重试3次,每次重试间隔由消费者进程的 --sleep 参数控制,超过3次后任务进入失败队列或标记为失败。
消费者进程启动后如何监控任务状态?
启动消费者进程使用 php think queue:work 命令,支持 --daemon 模式以保持常驻内存提高性能。监控任务状态可以通过查看数据库中的 jobs 表(如果使用 database 驱动)或 Redis 中的列表键。对于已完成的任务,它们会被从队列中删除或移动到 failed_jobs 表。可以使用 php think queue:flush 清空队列,或使用 php think queue:restart 优雅重启消费者。


















