Laravel之队列「建议收藏」

Laravel之队列「建议收藏」Laravel之队列

大家好,又见面了,我是你们的朋友全栈君。

一.配置

队列配置文件存放在config/queue.php 。在该文件中你将会找到框架自带的每一个队列驱动的连接配置,包括数据库、Beanstalkd、 IronMQ、 Amazon SQS、 Redis 以及同步(本地使用)驱动。其中还包含了一个 null 队列驱动以拒绝队列任务。

默认是sync,即同步的,直接处理,无队列.要将其修改为对应的类型,如database,redis等

laravel学院文档地址

使用redis为例

1,在config/queue.php

return [

    'default' => env('QUEUE_DRIVER', 'sync'),

    'connections' => [
        'sync' => [
            'driver' => 'sync',
        ],
        'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'default',
            'expire' => 60,
        ],
        'beanstalkd' => [
            'driver' => 'beanstalkd',
            'host' => 'localhost',
            'queue' => 'default',
            'ttr' => 60,
        ],
        'sqs' => [
            'driver' => 'sqs',
            'key' => 'your-public-key',
            'secret' => 'your-secret-key',
            'queue' => 'your-queue-url',
            'region' => 'us-east-1',
        ],
        'iron' => [
            'driver' => 'iron',
            'host' => 'mq-aws-us-east-1.iron.io',
            'token' => 'your-token',
            'project' => 'your-project-id',
            'queue' => 'your-queue-name',
            'encrypt' => true,
        ],
        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => 'default',
            'expire' => 60,
        ],
    ],

    'failed' => [
        'database' => 'mysql', 'table' => 'failed_jobs',
    ],
];

参数配置解析:

1: 该配置文件第一个配置项default用于指定默认的队列驱动,这里我们将其值改为redis(实际上是修改.env中的QUEUE_DRIVER)。
2:connections配置项包含了Laravel支持的所有队列驱动,我们使用Redis驱动,所以需要配置redis项:connection对应config/database.php中redis的default配置;
3:queue为默认队列名称;
4:expire为队列任务过期时间(秒)。这里我们可以保持其默认配置不变。
5:failed配置项用于配置失败队列任务存放的数据库及数据表。这里我们需要按照自己的数据库配置对其做相应修改。

使用databases为例

  • 为了使用database 队列驱动,需要一张数据库表来存放任务,要生成创建该表的迁移,运行 Artisan 命令queue:table ,迁移被创建好了之后,使用migrate 命令运行迁移:
php artisan queue:table
php artisan migrate
安装依赖包

项目根目录可安装如下依赖包

  • 下面是以上列出队列驱动需要安装的依赖:
• Amazon SQS: aws/aws-sdk-php ~3.0
• Beanstalkd: pda/pheanstalk ~3.0
• IronMQ: iron-io/iron_mq ~2.0
• Redis: predis/predis ~1.0
生成任务类
  • 1.默认情况下,应用的所有队列任务都存放在app/Jobs 目录。你可以使用 Artisan CLI 生成新的队列任务:
php artisan make:job SendReminderEmail --queued    //--queued告诉 Laravel 该任务应该被推送到队列而不是同步运行。

该命令将会在app/Jobs 目录下生成一个新的类,并且该类实现了Illuminate\Contracts\Queue\ShouldQueue接口

  • 2.SendReminderEmail.php代码如下:
<?php
 
namespace App\Jobs;
 
use Illuminate\Support\Facades\Log;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Models\User;
 
class SendReminderEmail extends Job implements SelfHandling, ShouldQueue
{ 
   
    use InteractsWithQueue, SerializesModels;
 
    protected $user;
    /** * Create a new job instance. * * @return void */
    public function __construct(User $user)
    { 
   
        $this->user = $user;
    }
 
    /** * 处理任务. * * @return void */
    public function handle()
    { 
   
        Log::alert('我是来自队列,发送了一个邮件',['id' => $this->user->id, 'name' => $this->user->name]);
    }
}
推送任务
  • 1,控制器中:
$user = Auth::user();
$this->dispatch((new SendReminderEmail($user))->delay(60)); //delay表示延迟队列执行
 
// 也可以将任务推送到不同的队列中
$this->dispatch((new SendReminderEmail($user))->onQueue('jobs'));
 
// 也可以从请求中分发任务
$this->dispatchFrom('App\Jobs\ProcessOrder', $request, [附加的参数]);
  • 2.其他地方使用
use DispatchesJobs;

$this->dispatch()
  • 3,任务发生异常
a.任务在处理的时候发生异常,任务将被放回队列.在下一次再被处理
b.判断同一任务失败的次数
$this->attempts() // 返回失败次数
$this->release(50); // 将任务放回到队列,50秒后次执行
启动队列监听
  • 基本命令
php artisan queue:listen connection_name --queue=queue_name
 
php artisan queue:listen connection //指定连接,也就是不同队列类型,如database,redis,在queue.php中配置
 
php artisan queue:listen --queue=high,low //指定队列优先级,比如有限处理某队列,多个队列用,分割
 
php artisan queue:listen --timeout=60 //每个任务运行最大时间不超过60秒
 
php artisan queue:listen --sleep=5 //没有任务的时候休眠5秒
 
php artisan queue:listen --tries=3 //失败任务尝试3次

queue:work 默认只执行一次队列请求, 当请求执行完成后就终止;
queue:listen 监听队列请求,只要运行着,就能一直接受请求,除非手动终止;

  • 作为系统进程运行Supervisor

Supervisor 配置文件通常存放在/etc/supervisor/conf.d 目录,在该目录中,可以创建多个配置文件指示 Supervisor 如何监视进程,例如,让我们创建一个开启并监视queue:work 进程的laravel-worker.conf 文件:

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

在本例中, numprocs 指令让 Supervisor 运行多 个queue:work 进程并监视它们,如果失败的话自动重启。配置文件创建好了之后,可以使用如下命令更新 Supervisor 配置并开启进程:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

如果出现异常:

可查看我博客的supervisor错误排查

  • 后台队列(守护进程)

Artisan 命令queue:work 包含一个–daemon 选项来强制队列 worker 持续处理任务而不必重新启动框架。相较于queue:listen 命令该命令对 CPU 的使用有明显降低:

php artisan queue:work connection --daemon
php artisan queue:work connection --daemon --sleep=3
php artisan queue:work connection --daemon --sleep=3 --tries=3

正如你所看到的, queue:work 任务支持大多数queue:listen 中有效的选项。你可以使用php artisan help queue:work 任务来查看所有有效选项。

注意点:

1.后台队列 worker 在处理每个任务时不重启框架,因此,你要在任务完成之前释放资源,举个例子,如果你在使用 GD 库操作图片,那么就在完成时使用imagedestroy 释放内存。类似的,数据库连接应该在后台长时间运行完成后断开,你可以使用DB::reconnect 方法确保获取了一个新的连接。

2.如果修改了代码,在后台队列中是无效的,必须重启队列
php artisan queue:restart
这个命令依赖于缓存系统重启进度表,默认情况下,APC 在 CLI 任务中无法正常工作,如果你在使用 APC,需要在 APC 配置中添加apc.enable_cli=1 。

处理失败任务
  • 创建一个 failed_jobs 表的迁移
php artisan queue:failed-table
  • 生成表
php artisan migrate

操作完成后,在databases/migrations中会新增一个php文件

  • 加重试次数限制
php artisan queue:listen connection-name --tries=3

超过3次的任务将被移到failed_jobs表

  • 添加失败任务事件

1,AppServiceProvider中添加

/** * 启动应用服务 * * @return void */
public function boot()
{ 
   
    Queue::failing(function ($connection, $job, $data) { 
   
    // Notify team of failing job...
    });
}

2,在任务类中添加

/** * 执行任务 * * @param Mailer $mailer * @return void */
public function handle(Mailer $mailer)
{ 
   
    //
}
 
/** * 处理失败任务 * * @return void */
public function failed()
{ 
   
    // Called when the job is failing...
}
重试失败任务
//a.查看失败的任务
php artisan queue:failed
 
//b.重新执行失败任务
php artisan queue:retry 5 //重新执行id为5的失败任务
 
//c.删除失败任务
php artisan queue:forget 5 //删除id为5的失败任务
 
//d.删除所有任务
php artisan queue:flus
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105884.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于SpringCloud项目注册中心eruka切换nacos注册不成功记录

    关于SpringCloud项目注册中心eruka切换nacos注册不成功记录使用IDEA新建的项目,SpringBoot版本是2.1.9,引入的nacos版本是0.2.1.RELEASE,配置都是ok的,启动项目也没有报错,但是一直就是注册不上去,原因是因为SpringBoot的版本太高,nacos版本太低,导致不兼容,兼容版本SpringBoot版本是2.0.6.RELEASE,nacos版本是0.2.1.RELEASE…

    2022年8月21日
    6
  • COM编程之三 QueryInterface

    COM编程之三 QueryInterface【1】IUnknown接口客户同组件交互都是通过接口完成的。在客户查询组件的其它接口时,也是通过接口完成的。而那个接口就是IUnknown。IUnknown接口的定义包含在Win32SDK中的UNKNEN.h头文件中。引用如下:1interfaceIUnknown2{3virtualHRESULT__stdcallQueryInterface(const…

    2022年6月23日
    25
  • spring spel表达式_substring sql

    spring spel表达式_substring sqlSpEL表达式简介用法1.注解@Value2.XML配置3.Expression表达式语法简介SpringExpressionLanguage(缩写为SpEL)是一种强大的表达式语言。在Spring产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。依赖:在这里插入代码片用法SpEL有三种用法,一种是在注解@Value中

    2025年8月28日
    7
  • java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener问题解决

    java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener问题解决

    2020年11月12日
    197
  • java输入语句怎么写_java输入语句应该怎样写?示例演示

    java输入语句怎么写_java输入语句应该怎样写?示例演示作为初步进入java开发学习的小白来说,就像是小时候刚刚学说话一样,这种经历既是必然的也是有趣的,学习java语言一开始的时候也是得一步步的学习,比如说,java输入语句应该这么去实现呢?一起跟小编来看看吧。第一步:导包。先将java.io.*;以及java.util.*;导入Java代码中。charc=(char)System.in.read();是输入单个字符;inta=cin.nextI…

    2022年7月9日
    35
  • 架设邮件服务器-windows 2003 POP3服务,SMTP服务收发邮件「建议收藏」

    1.默认安装的系统是没有安装POP3组件,SMTP组件,搞个盘过来,或从网上下载一个i386(下载地址:http://down.spdns.com/i386.rar ).(1)从“控制面板→添加/删除程序→添加windows组件”中,进入“Windwos组件”界面,激活“应用程序服务器”一行,然后单击“详细信息”按钮,进入“应用程序服务器”页,选择“Internet信息服务(IIS)”复选

    2022年4月6日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号