前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel 队列

Laravel 队列

作者头像
崔哥
发布2023-02-27 15:52:32
1.1K0
发布2023-02-27 15:52:32
举报
文章被收录于专栏:崔哥的专栏

创建任务

生成任务类

代码语言:javascript
复制
root@php-fpm:/var/www/laravel-demo# php artisan make:job PublishArticles
Job created successfully.

编辑一下

代码语言:javascript
复制
class PublishArticles implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public Article $article;
    public function __construct(Article $article)
    {
        $this->article=$article;
    }
    public function handle()
    {
        Log::info($this->article);
        //todo 发布文章
    }
}

调度任务,在web应用的控制器中,或控制台命令中都可以调用

代码语言:javascript
复制
$article=Article::query()->first();
\App\Jobs\PublishArticles::dispatch($article);

运行队列工作者

代码语言:javascript
复制
#效率高,代码更新时必须重启队列
php artisan queue:work

#效率低,代码更新时不必重启队列
php artisan queue:listen

php artisan queue:work redis

php artisan queue:work redis --queue=emails

php artisan queue:work --once

php artisan queue:work --max-jobs=1000

php artisan queue:work --stop-when-empty

# 处理进程一小时,然后退出...
php artisan queue:work --max-time=3600

php artisan queue:work --sleep=3

由于队列任务是长期存在的进程,因此如果不重新启动,他们不会注意到代码的更改。因此,使用队列任务部署应用程序的最简单方法是在部署过程中重新启动任务。您可以通过发出 queue:restart 命令优雅地重新启动所有进程:

代码语言:javascript
复制
php artisan queue:restart

队列驱动

null

丢弃排队任务

代码语言:javascript
复制
QUEUE_CONNECTION=null

sync

立即执行任务的同步驱动程序(用于本地开发期间)

代码语言:javascript
复制
QUEUE_CONNECTION=sync

redis

代码语言:javascript
复制
composer require predis/predis
代码语言:javascript
复制
QUEUE_CONNECTION=redis

database

代码语言:javascript
复制
php artisan queue:table

php artisan migrate
代码语言:javascript
复制
QUEUE_CONNECTION=database

beanstalkd

代码语言:javascript
复制
composer require pda/pheanstalk
代码语言:javascript
复制
QUEUE_CONNECTION=beanstalkd

处理失败的工作

创建 failed_jobs 表的迁移通常已经存在于新的 Laravel 应用程序中。但是,如果您的应用程序不包含此表的迁移,您可以使用 queue:failed-table 命令来创建迁移:

代码语言:javascript
复制
php artisan queue:failed-table

php artisan migrate

失败重试

代码语言:javascript
复制
#重试3次
#如果您没有为 --tries 选项指定值,则作业将仅尝试一次或与任务类的 $tries 属性指定的次数相同:
php artisan queue:work redis --tries=3

#重试3次,每次都3秒后重试
php artisan queue:work redis --tries=3 --backoff=3

#重试任务前等待的秒数。
public $backoff = 3;

#计算重试任务之前要等待的秒数。
public function backoff()
{
    return 3;
}

#计算重试任务之前要等待的秒数。
#第一次重试的重试延迟为 1 秒,第二次重试为 5 秒,第三次重试为 10 秒:
public function backoff()
{
    return [1, 5, 10];
}

任务失败后发送告警

代码语言:javascript
复制
class ProcessPodcast implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    protected $podcast;
    public function __construct(Podcast $podcast)
    {
        $this->podcast = $podcast;
    }
    public function handle(AudioProcessor $processor)
    {
        // 处理上传的播客...
    }
    public function failed(Throwable $exception)
    {
        // 向用户发送失败通知等...
    }
}

手动重试

代码语言:javascript
复制
#查看失败的任务(failed_jobs表)
php artisan queue:failed

#任务 ID 可用于重试失败的任务
php artisan queue:retry ce7bb17c-cdd8-41f0-a8ec-7b4fef4e5ece

#如有必要,可以向命令传递多个 ID:
php artisan queue:retry ce7bb17c-cdd8-41f0-a8ec-7b4fef4e5ece 91401d2c-0784-4f43-824c-34f94a33c24d

#还可以重试指定队列的所有失败任务:
php artisan queue:retry --queue=name

#重试所有失败任务,可以执行 queue:retry 命令,并将 all 作为 ID 传递:
php artisan queue:retry all

#如果要删除指定的失败任务,可以使用 queue:forget 命令:
php artisan queue:forget 91401d2c-0784-4f43-824c-34f94a33c24d

#删除 failed_jobs 表中所有失败任务,可以使用 queue:flush 命令:
php artisan queue:flush

#删除失败的任务2(和queue:flush有何不同?)
php artisan queue:prune-failed
php artisan queue:prune-failed --hours=48

忽略缺失的模型

代码语言:javascript
复制
/**
 * 如果任务的模型不存在,则删除该任务。
 *
 * @var bool
 */
public $deleteWhenMissingModels = true;

丢弃失败的任务而不存储它们

代码语言:javascript
复制
QUEUE_FAILED_DRIVER=null

从队列中清除任务

代码语言:javascript
复制
php artisan queue:clear

php artisan queue:clear redis --queue=emails

注意:从队列中清除任务仅适用于 SQS、Redis 和数据库队列驱动程序。 此外,SQS 消息删除过程最多需要 60 秒,因此在你清除队列后 60 秒内发送到 SQS 队列的任务也可能会被删除。

监控你的队列 [新特性]

代码语言:javascript
复制
php artisan queue:monitor redis:default,redis:deployments --max=100

参考

https://learnku.com/docs/laravel/9.x/queues/12236

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建任务
  • 运行队列工作者
  • 队列驱动
    • null
      • sync
        • redis
          • database
            • beanstalkd
            • 处理失败的工作
              • 失败重试
                • 任务失败后发送告警
                  • 从队列中清除任务
                    • 监控你的队列 [新特性]
                    • 参考
                    相关产品与服务
                    云数据库 Redis
                    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档