一.配置

队列配置文件存放在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代码如下:
<?phpnamespace 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_namephp 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

Laravel之队列相关推荐

  1. Php laravel 队列,Laravel 的队列系统介绍

    这篇文章主要介绍的内容是关于Laravel 的队列系统介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 Laravel 队列为不同的后台队列服务提供统一的 API , 例如 Bean ...

  2. 无涯教程: Laravel 8 - 队列介绍

    有时,你发送电子邮件或站内消息比较费时,这时可以使用队列处理这些任务. 步骤1:下载Laravel 8 首先,我们需要使用下面命令获取最新的Laravel 8版本应用程序. composer crea ...

  3. laravel 使用队列进行微信模板消息的群发

    前置准备工作 框架:laravel 5.5 公众号:我的是服务号(需要营业执照申请,300一年) PHP版本:7.1 需要自己配置好php环境,安装好redis 直接进入代码主题 php artisa ...

  4. Laravel redis队列不执行

    配置redis队列,以为直接配置env改这个QUEUE_CONNECTION=redis,但是发现实际没有执行队列,如果是datebase或者sync的是没问题,但是redis就有可能出现问题 按照文 ...

  5. laravel实现队列

    一:队列配置 队列的配置文件放置在config/queue.php文件中,laravel框架中支持的队列驱动有:sync, database, beanstalkd, sqs, redis,null对 ...

  6. laravel异步队列的使用

    功能实现描述:在做大富翁网页小游戏时候,用户跳转指定步数需要获取相关奖品,例如优惠券,实物奖,此时需要给用户发送系统消息,如果他注册了网站.此时就用到了异步 1.首先在laravel用异步很方便. P ...

  7. 使用 Supervisor 配置 Laravel 运行队列处理器

    阅读目录 配置 Supervisor 启动 Supervisor 配置 Supervisor Supervisor 的配置文件通常位于 /etc/supervisor/conf.d 目录下. 在该目录 ...

  8. laravel 任务队列_Laravel 队列的简单使用例子

    php artisan make:job SynUser 4.在队列类里面的handle方法中写上业务逻辑(比如发送网络请求,发送邮件等等,这里简单写个日志代替) protected $message ...

  9. laravel 任务队列_laravel队列-让守护进程处理耗时任务

    待解决的问题 最近在做一个服务器集群管理的web项目,需要处理一些极其耗时的操作,比如磁盘格式化分区.对于这个需求,最开始的想法是,为了让节点上的rpc(远程过程调用) service端尽可能简单(简 ...

  10. Laravel 队列发送邮件

    批量处理任务的场景在我们开发中是经常使用的,比如邮件群发,消息通知,短信,秒杀等等,我们需要将这个耗时的操作放在队列中来处理,从而大幅度缩短Web请求和相应的时间.下面讲解下Laravel中队列的使用 ...

最新文章

  1. 立体相机开发|几何感知的实例分割
  2. centos7下的FastDFS5.09的安装与使用
  3. Revit二次开发示例:DeleteDimensions
  4. hdu 2155(dp)
  5. IDEA 2020.3.2控制台中文乱码分享(亲测二、下图中控制台的编码改为UTF-8)
  6. python实现两张图片横向和纵向拼接
  7. 【干货】快速部署微软开源GPU管理利器: OpenPAI
  8. IOS开发之视图和视图控制器
  9. PageNotFound.noHandlerFound No mapping found for HTTP request with URI
  10. SQK Server提示:安装程序无法与下载服务器联系。请提供 Microsoft R Open 和 Microsoft R Server
  11. 74CMS4.1.2.4版本黑盒测试
  12. 红蜘蛛显示器测试软件,红蜘蛛5使用displayCAL校准显示器(蓝绿蜘蛛5通用)
  13. 深度学习(deep learning)发展史
  14. 百度搜索框搜索时显示或者隐藏历史搜索记录
  15. 实时采集福利彩票的中奖信息和最新开奖信息-JAVA
  16. 网络统考计算机应用基础ppt视频,计算机应用基础课程网络统考辅导.ppt
  17. Visual Studio “另一个安装程序已开始运行。请先等它完成,然后再重试”和“正在进行其他安装,请稍后重试...”解决方法
  18. Jaeger入门简介
  19. GBase 8a 支持存储过程、自定义函数的定义和使用
  20. 微信小程序 - 页面插入广告(激励式广告)超详细教程

热门文章

  1. 樊登读书分享ppt_最后一波 | 24份樊登亲手撰写PPT免费送
  2. c语言入门教程--1编译器
  3. 对图像 香农费诺编码 matlab 实现,香农编码费诺编码.doc
  4. 简单的程序工具:matlab实现香农编码
  5. 工科数学分析部分知识点整理
  6. OA办公系统如何实现最佳界面效果
  7. 110KV/35KV/10KV富源变电站一次系统设计
  8. 计算机点击右键管理闪退,Win7系统桌面鼠标右键菜单出现闪退解决方法
  9. 安装Ruby、多版本Ruby共存、Ruby安装慢问题
  10. 自动写诗APP项目、基于python+Android实现(技术:LSTM+Fasttext分类+word2vec+Flask+mysql)第二节