在 Laravel 中,使用 php artisan queue
创建并执行异步任务的完整流程如下:
1. 配置队列驱动
在 .env
文件中设置队列驱动(如 database
、redis
、sqs
等):env复制下载
QUEUE_CONNECTION=database
如果需要使用 database
驱动,需先创建 jobs
表:bash复制下载
php artisan queue:table php artisan migrate
2. 创建异步任务(Job)
使用 Artisan 生成一个 Job 类:bash复制下载
php artisan make:job ProcessPodcast
3. 分发任务(Dispatch Job)
在控制器或 CLI 命令中调用 Job:php复制下载
use App\Jobs\ProcessPodcast; // 分发任务到队列 ProcessPodcast::dispatch($podcastData); // 延迟执行(5秒后运行) ProcessPodcast::dispatch($podcastData)->delay(now()->addSeconds(5)); // 指定队列(如 "high" 优先级队列) ProcessPodcast::dispatch($podcastData)->onQueue('high'); // 传输参数例子 ImportSCEyeScreeningBatRoaster::dispatch($task->id,$EyeScreeningBatID,$path,Admin::user());
4. 启动队列 Worker
运行队列处理器:bash复制下载
php artisan queue:work
常用选项:
选项 | 说明 |
---|---|
--queue=high,default | 优先处理 high 队列 |
--tries=3 | 失败任务重试次数 |
--timeout=60 | 任务超时时间(秒) |
--daemon | 守护进程模式(生产环境推荐) |
5. 任务执行流程
- 任务入队
dispatch()
将任务序列化后存入jobs
表(database
驱动)。
- Worker 监听队列
queue:work
从队列中取出任务并反序列化。
- 执行
handle()
方法- 运行 Job 类中的业务逻辑。
- 任务完成/失败
- 成功:任务从队列删除。
- 失败:任务进入
failed_jobs
表(需配置)。