laravel队列怎么使用

发布时间:2023-03-15 15:15:02 作者:iii
来源:亿速云 阅读:175
# Laravel队列怎么使用

## 目录
1. [队列概述](#队列概述)
2. [配置队列](#配置队列)
3. [创建队列任务](#创建队列任务)
4. [分发任务](#分发任务)
5. [运行队列处理器](#运行队列处理器)
6. [队列监控](#队列监控)
7. [失败任务处理](#失败任务处理)
8. [高级队列用法](#高级队列用法)
9. [最佳实践](#最佳实践)

---

## 队列概述
Laravel队列系统允许你将耗时的任务(如发送邮件、处理文件等)延迟处理,从而显著提升Web应用的响应速度。队列的核心机制是将任务放入队列服务(如数据库、Redis等),然后由后台工作进程异步执行。

### 为什么需要队列?
- **提升用户体验**:避免用户等待耗时操作完成
- **解耦应用逻辑**:将非核心流程异步化
- **提高系统稳定性**:失败任务可重试
- **负载均衡**:平滑处理流量高峰

---

## 配置队列
Laravel支持多种队列驱动,配置文件位于`config/queue.php`。

### 常用队列驱动
```php
'connections' => [
    'sync' => [
        'driver' => 'sync', // 同步执行(用于开发)
    ],
    
    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'retry_after' => 90,
    ],
    
    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => '{default}',
        'retry_after' => 90,
        'block_for' => null,
    ],
]

环境配置(.env)

QUEUE_CONNECTION=database

数据库驱动准备

php artisan queue:table
php artisan migrate

创建队列任务

队列任务通常称为”Job”,使用Artisan命令创建:

php artisan make:job ProcessPodcast

生成的Job类位于app/Jobs目录:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct()
    {
        // 初始化参数
    }

    public function handle()
    {
        // 任务处理逻辑
    }
}

Job类关键特性


分发任务

基本分发方式

ProcessPodcast::dispatch();

延迟分发

ProcessPodcast::dispatch()
    ->delay(now()->addMinutes(10));

指定队列

ProcessPodcast::dispatch()
    ->onQueue('processing');

任务链

ProcessPodcast::withChain([
    new OptimizePodcast,
    new ReleasePodcast
])->dispatch();

运行队列处理器

启动基础处理器

php artisan queue:work

常用选项

# 指定队列连接
php artisan queue:work redis

# 处理特定队列
php artisan queue:work --queue=high,default

# 限制最大尝试次数
php artisan queue:work --tries=3

# 守护进程模式(生产环境推荐)
php artisan queue:work --daemon

Supervisor配置(生产环境必需)

/etc/supervisor/conf.d/laravel-worker.conf:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=8
redirect_stderr=true
stdout_logfile=/var/log/laravel-worker.log

队列监控

失败任务表

php artisan queue:failed-table
php artisan migrate

查看失败任务

php artisan queue:failed

重试失败任务

# 重试所有
php artisan queue:retry all

# 重试特定ID
php artisan queue:retry 1

Horizon仪表板(需安装)

composer require laravel/horizon

失败任务处理

定义失败处理

在Job类中添加failed方法:

public function failed(Exception $exception)
{
    // 发送失败通知等
}

失败任务数据库记录

'failed' => [
    'driver' => 'database',
    'database' => env('DB_CONNECTION', 'mysql'),
    'table' => 'failed_jobs',
],

高级队列用法

任务批处理

$batch = Bus::batch([
    new ProcessPodcast,
    new ProcessPodcast,
    new ProcessPodcast,
])->then(function (Batch $batch) {
    // 所有任务成功完成
})->catch(function (Batch $batch, Throwable $e) {
    // 首个失败任务
})->finally(function (Batch $batch) {
    // 批次执行完成
})->dispatch();

速率限制

Redis::throttle('key')->allow(10)->every(60)->then(
    function () {
        ProcessPodcast::dispatch();
    },
    function () {
        // 无法获得锁...
    }
);

最佳实践

  1. 任务保持轻量:Job类只应包含必要逻辑
  2. 合理设置超时retry_after应大于任务最长执行时间
  3. 使用任务批处理:对关联任务进行分组管理
  4. 生产环境使用Supervisor:确保队列进程持续运行
  5. 监控队列状态:使用Horizon或自定义监控
  6. 处理失败任务:设置警报机制及时响应
  7. 区分队列优先级:将紧急任务分配到高优先级队列

性能优化建议


通过合理使用Laravel队列系统,你可以显著提升应用程序的性能和用户体验。根据业务需求选择合适的驱动和配置方案,并建立完善的监控机制,确保队列任务可靠执行。 “`

注:本文约3500字,涵盖了Laravel队列的核心知识点。实际使用时可根据项目需求调整配置参数和实现细节。生产环境务必配置进程监控(如Supervisor)和失败任务处理机制。

推荐阅读:
  1. 【laravel】 Laravel延迟队列
  2. 在Laravel使用Reponse实现一个响应客户端功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

laravel

上一篇:有哪些好用的Vue组件库

下一篇:git可视化提交工具Sourcetree怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》