实例讲解Laravel队列的简单使用

本篇文章给大家带来了laravel的相关知识,其中主要介绍了Laravel队列、在什么情况下使用队列、配置队列储存等相关问题,希望对大家有帮助。 本文将介绍如何在 Laravel ...

本篇文章给大家带来了laravel的相关知识,其中主要介绍了Laravel队列、在什么情况下使用队列、配置队列储存等相关问题,希望对大家有帮助。

实例讲解Laravel队列的简单使用插图1

本文将介绍如何在 Laravel 中使用队列,以及了解了为什么使用队列

什么情况使用队列?

耗时的,比如上传一个文件后进行一些格式的转化等。

需要保证送达率的,比如发送短信,因为要调用别人的 api,总会有几率失败,那么为了保证送达,重试就必不可少了。

记录使用过程:

一、配置队列存储

队列配置文件存放在 config/queue.php,默认为 sync 同步处理,这里可以选择 redis,database 等,使用方法如下。

数据库

创建数据表存储任务,执行完 artisan 命令后运行数据迁移

phpartisanqueue:tablephpartisanmigrate

Redis

为了使用 redis 队列驱动,你需要在你的配置文件 config/database.php 中配置Redis的数据库连接。

如果你的 Redis 队列连接使用的是 Redis 集群,你的队列名称必须包含 key hash tag。这是为了确保所有的 Redis 键对于一个给定的队列都置于同一哈希中:

'redis'=>['driver'=>'redis','connection'=>'default','queue'=>'default','retry_after'=>90,],二、创建任务类

队列的任务类在 app/Jobs/ 目录下

phpartisanmake:jobSaveBusLine

修改文件如下:

namespaceApp\Jobs;useApp\Http\Repository\BusRepository;useIlluminate\Bus\Queueable;useIlluminate\Queue\SerializesModels;useIlluminate\Queue\InteractsWithQueue;useIlluminate\Contracts\Queue\ShouldQueue;useIlluminate\Foundation\Bus\Dispatchable;classSaveBusLineimplementsShouldQueue{useDispatchable,InteractsWithQueue,Queueable,SerializesModels;/***任务最大尝试次数。**@varint*/public$tries=3;/***任务运行的超时时间。**@varint*/public$timeout=60;private$datum;/***Createanewjobinstance.*@paramarray|object$datum**@returnvoid*/publicfunction__construct($datum){$this->datum=$datum;}/***Executethejob.**@returnvoid*/publicfunctionhandle(){BusRepository::getInstent()->updateBusLine($this->datum);}}

在控制器或仓库中调用队列方法:

useApp\Jobs\SaveBusLine;useCarbon\Carbon;/*****************队列操作start*******************/SaveBusLine::dispatch($arrayData)->delay(Carbon::now()->addMinute(1));/*****************队列操作end*******************/三、启动队列任务phpartisanqueue:work四、Supervisor 配置

安装 Supervisor

Supervisor 是一个 Linux 操作系统上的进程监控软件,它会在 queue:listen 或 queue:work 命令发生失败后自动重启它们。在 Ubuntu 安装 Supervisor,可以用以下命令:

sudoapt-getinstallsupervisor

{tip} 如果自己手动配置 Supervisor 听起来有点难以应付,可以考虑使用 Laravel Forge,它能给你的 Laravel 项目自动安装与配置 Supervisor。

配置 Supervisor

Supervisor 的配置文件一般是放在 /etc/supervisor/conf.d 目录下。在这个目录中你可以创建任意数量的配置文件来要求 Supervisor 怎样监控你的进程。例如我们创建一个 laravel-worker.conf 来启动与监控一个 queue:work 进程:

[program:laravel-worker]process_name=%(program_name)s_%(process_num)02dcommand=php~/laravel/artisanqueue:workredis--sleep=3--tries=3autostart=trueautorestart=trueuser=lisgroupnumprocs=8redirect_stderr=truestdout_logfile=/home/lisgroup/logs/worker.log

这个例子里的 numprocs 命令会要求 Supervisor 运行并监控 8 个 queue:work 进程,并且在它们运行失败后重新启动。当然,你必须更改 command 命令的 queue:work redis ,以显示你所选择的队列驱动。还需要修改执行的用户 user=XXX

启动 Supervisor

当这个配置文件被创建后,你需要更新 Supervisor 的配置,并用以下命令来启动该进程:

sudosupervisorctlrereadsudosupervisorctlupdatesudosupervisorctlstartlaravel-worker:*

更多有关 Supervisor 的设置与使用,请参考 Supervisor 官方文档。

五、处理失败的任务

有时候你队列中的任务会失败。不要担心,本来事情就不会一帆风顺。Laravel 内置了一个方便的方式来指定任务重试的最大次数。当任务超出这个重试次数后,它就会被插入到 failed_jobs 数据表里面。要创建 failed_jobs 表的迁移文件,你可以用 queue:failed-table 命令,接着使用 migrate Artisan 命令生成 failed_jobs 表:

phpartisanqueue:failed-tablephpartisanmigrate

然后运行队列处理器,在调用 queue worker,命令时你应该通过 --tries 参数指定任务的最大重试次数。如果不指定,任务就会永久重试:

phpartisanqueue:workredis--tries=3

六、清除失败任务

你可以在任务类里直接定义 failed 方法,它能在任务失败时运行任务的清除逻辑。这个地方用来发一条警告给用户或者重置任务执行的操作等再好不过了。导致任务失败的异常信息会被传递到 failed 方法:

namespaceApp\Jobs;useException;useApp\Podcast;useApp\AudioProcessor;useIlluminate\Bus\Queueable;useIlluminate\Queue\SerializesModels;useIlluminate\Queue\InteractsWithQueue;useIlluminate\Contracts\Queue\ShouldQueue;classProcessPodcastimplementsShouldQueue{useInteractsWithQueue,Queueable,SerializesModels;protected$podcast;/***创建一个新的任务实例。**@paramPodcast$podcast*@returnvoid*/publicfunction__construct(Podcast$podcast){$this->podcast=$podcast;}/***执行任务。**@paramAudioProcessor$processor*@returnvoid*/publicfunctionhandle(AudioProcessor$processor){//处理上传播客...}/***要处理的失败任务。**@paramException$exception*@returnvoid*/publicfunctionfailed(Exception$exception){//给用户发送失败通知,等等...}}

产品猿社区致力收录更多优质的商业产品,给服务商以及软件采购客户提供更多优质的软件产品,帮助开发者变现来实现多方共赢;

日常运营的过程中我们难免会遇到各种版权纠纷等问题,如果您在社区内发现有您的产品未经您授权而被用户提供下载或使用,您可按照我们投诉流程处理,点我投诉

本文来自用户发布投稿,不代表产品猿立场 ;若对此文有疑问或内容有严重错误,可联系平台客服反馈;

部分产品是用户投稿,可能本文没有提供官方下下载地址或教程,若您看到的内容没有下载入口,您可以在我们产品园商城搜索看开发者是否有发布商品;若您是开发者,也诚邀您入驻商城平台发布的产品,地址:点我进入

如若转载,请注明出处:http://www.chanpinyuan.cn/33432.html;
(0)
上一篇 2023年1月17日 下午4:16
下一篇 2023年1月17日 下午4:17

相关推荐

发表回复

登录后才能评论
分享本页
返回顶部