Laravel 框架中队列的使用

在这里插入图片描述

概述

Laravel 框架内置了强大的队列系统,用于处理异步任务、提高系统性能等。队列可以让任务异步执行,而不会阻塞当前进程,可以提高系统的处理能力。

Laravel 的队列系统支持多种驱动,如 Redis、Beanstalkd、SQS 等,可以根据自己的需求选择合适的驱动。

安装

Laravel 框架已经内置了队列组件,所以不需要单独安装。

配置队列

在 Laravel 中,队列的配置可以通过 config/queue.php 文件进行设置,也可以在代码中进行指定。此外,还可以通过 .env 文件中的配置来设置默认的队列驱动程序和其他选项。

默认情况下,Laravel 配置文件中的队列驱动为 sync,即同步模式,任务会立即执行,不会进入队列。如果需要使用队列,可以将驱动设置为支持队列的驱动,如 database、 redis、beanstalkd 等。

通过在 .env 文件中设置队列配置选项,可以方便地在不同的环境中进行队列配置。例如,可以在本地环境中使用 sync 驱动程序,在生产环境中使用 database 驱动程序。

例如:

QUEUE_CONNECTION=databaseDB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=username
DB_PASSWORD=password注意,这里我们使用了 database 队列驱动,并且连接的是 MySQL 数据库。在实际开发中,根据自己的需要选择适合的驱动和数据库连接

通过修改 config/queue.php 文件,可以方便地在不同的环境中进行队列配置,例如在本地开发环境和生产环境中使用不同的队列驱动程序。此外,您还可以添加新的队列连接选项,以便在代码中指定不同的队列连接。

例如:

'connections' => [// ...'database' => ['driver' => 'database','table' => 'gkb_sis_jobs','queue' => 'default','retry_after' => 90,'after_commit' => false,'connection' => 'business',],
],示例参数说明:1.driver: 指定队列驱动程序为 database。2.table: 指定存储队列任务的表名。3.queue: 指定要处理的队列名称。如果未指定,则默认为 default 队列。4.retry_after: 指定队列任务在失败后的重试时间(秒数)。5.after_commit: 指定在事务提交后才将任务推送到队列。如果将此选项设置为 true,则需要在启用队列时使用事务。6.connection: 指定使用的数据库连接。如果未指定,则使用默认数据库连接。

需要注意的是,通过 config/queue.php 文件中的设置,您可以为不同的队列连接指定不同的队列驱动程序、队列名称、最大尝试次数等选项。如果您的应用程序需要使用多个队列连接,那么可以在该文件中为每个连接指定不同的配置选项。然后在代码中,可以使用 onConnection 方法来指定要使用的队列连接,还使用 onQueue 方法来指定要使用的队列名称。

例如:

Emails::dispatch($EmailData)->onConnection('database')->onQueue('Emails');
在这个示例中,我们将任务分发到 database 队列连接的 Emails 队列中。

定义任务

定义任务是使用队列的关键。在 Laravel 中,任务通常是一个可序列化的 PHP 对象,该对象包含需要执行的任务的代码和数据。

可以使用 Artisan 命令来生成任务类:

php artisan make:job Emails

生成的任务类位于 app/Jobs 目录中,可以根据需要修改其中的 handle 方法来定义任务执行的逻辑。例如:

<?phpnamespace App\Jobs;use App\Common\Email;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;class Emails implements ShouldQueue
{use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;public $EmailData;/*** 创建一个新的任务实例* @param array $EmailData 发送邮件数据* @return void*/public function __construct($EmailData){$this->EmailData = $EmailData;}/*** 运行任务** @return void*/public function handle(){$mailer = Email::sendMailer($this->EmailData);if($mailer['error']){Log::channel('EmailData')->info($mailer['error']);}else{Log::channel('EmailData')->info('邮件发送成功----'.json_encode($this->EmailData));}}/*** 任务未能处理*/public function failed(\Exception $exception){Log::channel('EmailData')->info('邮件发送失败----'.json_decode($this->EmailData));}
}

在这个例子中,我们定义了一个 Emails 任务,该任务需要发送邮件给指定的邮箱地址。任务类实现了 ShouldQueue 接口,表明该任务需要通过队列执行。

handle 方法是任务的主要逻辑,这里我们调用了 Email 类中 sendMailer 方法来处理发送邮件的逻辑

分发任务

当定义好任务之后,需要将任务分发到队列中。Laravel 提供了多种方式来分发任务,下面介绍其中两种常见的方式:

同步任务

在开发环境中,我们可能需要同步执行任务,以便进行调试和测试。可以使用 dispatch 方法来同步执行任务。

例如:

Emails::dispatch($EmailData);

这里我们将 Emails 任务分发到队列中,该任务将同步执行。可以通过访问页面或查看日志来查看任务执行结果。

异步任务

在生产环境中,我们通常需要将任务分发到队列中异步处理。可以使用 dispatch 方法来异步执行任务。

例如:

Emails::dispatch($EmailData)->onConnection('database')->onQueue('Emails');

这里我们将 Emails 任务分发到 emails 队列中,并指定了 database 队列连接和 Emails 队列名称。

启动 Queue Worker 进程

定义好任务处理器并分发任务之后,我们需要启动 Queue Worker 进程来监听队列中的任务。在终端中使用如下命令启动 Queue Worker 进程:

php artisan queue:work database --queue=Emails

如果您要在后台运行队列进程,可以使用 nohup 命令,例如:

nohup php artisan queue:work database --queue=Emails &

使用 php artisan queue:work 命令,那么队列代码库中有任何更改都要重启队列,重启命令:

先查看队列进程:ps -ef|grep queue
杀死进程:kill PID
在后台启动: nohup php artisan queue:work database --queue=Emails &

以上命令将启动一个 Queue Worker 进程,并开始监听队列中的任务。如果队列中有任务,Queue Worker 进程会自动获取任务并调用相应的处理器进行处理。

其他命令

除了启动 Queue Worker 进程,Laravel 还提供了多种其他命令来管理队列。

例如:

php artisan queue:listen:启动一个监听器,监听队列中的任务,并在任务可用时处理任务。
php artisan queue:retry [id]:重新处理一个失败的任务。
php artisan queue:failed:列出所有失败的任务。
php artisan queue:flush:清空队列中的所有任务。

需要注意的是,队列处理器是长生命周期的进程,并将启动的应用程序状态存储在内存中。因此,在启动它们之后,代码库中的更改对其不起作用。因此,在部署过程中,一定要重新启动你的队列处理器。此外,请记住,应用程序创建或修改的任何静态状态不会在任务之间自动重置。或者,你可以运行 queue:listen 命令。在使用 queue:listen 命令时,当你想要重新加载更新的代码或重置应用程序状态时,你不必手动重新启动 worker;但是,这个命令的效率不如 queue:work。

注意

laravel 执行 php artisan 命令,之后导致 artisan 生成的日志文件,用户组是 root,导致 web 方式(用户属主:www)执行的代码无法去写入相应的日志文件

在 Laravel 中,你可以使用 config/logging.php 文件来配置日志文件路径和文件名,以及其他相关的日志选项。你可以在该文件中设置 permission 选项来指定日志文件的权限,例如

'channels' => ['stack' => ['driver' => 'stack','channels' => ['single','error'],'ignore_exceptions' => false,'permission' => 0777,],
]

这样,在 Laravel 中生成的日志文件权限就会自动设置为 0777,从而解决该问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(Java企业 / 公司项目)JMeter接口压测使用(保姆式手把手教会)

一. JMeter简介认识&#xff08;重点是下面的使用方法&#xff09; JMeter是一个开源的Java应用程序&#xff0c;由Apache软件基金会开发和维护&#xff0c;可用于性能测试、压力测试、接口测试等。 1. 原理 JMeter的基本原理是模拟多用户并发访问应用程序&#xff0c;通过发…

多目标优化(Python):多目标粒子群优化算法(MOPSO)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6(提供Python代码)

一、多目标粒子群优化算法 多目标粒子群优化算法&#xff08;MOPSO&#xff09;是一种用于解决多目标优化问题的进化算法。它基于粒子群优化算法&#xff08;PSO&#xff09;&#xff0c;通过引入多个目标函数和非支配排序来处理多目标问题。 MOPSO的基本思想是将问题转化为在…

C#,字符串匹配(模式搜索)AC(Aho Corasick)算法的源代码

Aho-Corasick算法简称AC算法&#xff0c;也称为AC自动机(Aho-Corasick)算法&#xff0c;1975年产生于贝尔实验室&#xff08;The Bell Labs&#xff09;&#xff0c;是一种用于解决多模式字符串匹配的经典算法之一。 the Bell Lab 本文的运行效果&#xff1a; AC算法以模式树…

深度学习记录--Train/dev/test sets

为什么需要训练集、验证集(简单交叉验证集)和测试集&#xff1f; 为了创建高效的神经网络&#xff0c;需要不断进行训练(迭代) 一个神经网络的产生 从最开始的想法idea开始&#xff0c;然后付诸于代码code&#xff0c;根据结果验证反过来对一开始的想法idea进行修正&#xf…

腾讯云服务器怎么买?两种购买方式更省钱

腾讯云服务器购买流程很简单&#xff0c;有两种购买方式&#xff0c;直接在官方活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动…

深度系统QT 环境搭建

1.QT安装 不折腾最新版直接去商店搜索QT安装。 2.修改su密码&#xff0c;安装需要权限 打开一个终端&#xff0c;然后输入下面的命令&#xff1a;按照提示输入密码按回车就行。 sudo passwd 回车后会出现让你输入现在这个账户的密码&#xff1a; 3.编译环境安装。 安…

CSS实现超出部分的省略

1、为什么要省略 在日常开发过程中我们难免会遇到后端返回给我们的的数据太长的情况&#xff0c;此时我们通常采取的是...的省略方式&#xff0c;其中的CSS大致如下&#xff0c;既可以实现对应的省略显示&#xff0c;但有些时候我们有需要用户可以查看具体的完整信息&#xff0…

利用Python的csv(CSV)库读取csv文件并取出某个单元格的内容的学习过程

csv库在python3中是自带的。 利用它可以方便的进行csv文件内容的读取。 注意&#xff1a;要以gbk的编码形式打开&#xff0c;因为WPS的csv文件默认是gbk编码&#xff0c;而不是utf-8。 01-读取表头并在打印每一行内容时一并输出表头 表头为第1行&#xff0c;现在要读取并打…

基础面试题整理4

1.mybatis的#{}和${}区别 #{}是预编译处理&#xff0c;${}是字符串替换#{}可以防止SQL注入&#xff0c;提高安全性 2.mybatis隔离级别 读未提交 READ UNCOMMITED&#xff1a;读到了其他事务中未提交的数据&#xff0c;造成"脏读","不可重复读","幻读&…

1月12日1月15日代码随想录路经总和从中序和后序遍历构造二叉树

112.路经总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 …

matlab|基于VMD-SSA-LSTM的多维时序光伏功率预测

目录 1 主要内容 变分模态分解(VMD) 麻雀搜索算法SSA 长短期记忆网络LSTM 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了预测的程序基于LSTM的负荷和可再生能源出力预测【核心部分复现】&#xff0c;该程序预测效果比较好&#xff0c;并且结构比较清晰&#…

buuctf-Misc 题目解答分解118-120

118.[INSHack2017]sanity 打开压缩包就是一个md 文件 typora 打开 发现flag INSA{Youre_sane_Good_for_you} 119.粽子的来历 解压压缩包 &#xff0c;得到文件夹如下 用010 editor 打开 我是A.doc 这个有些可以 都改成FF 保存 然后再次打开 docx 文件就发现了屈原的诗 其他b…

uniapp + node.js 开发问卷调查小程序

前后端效果图 后端&#xff1a;nodejs 12.8 ; mongoDB 4.0 前端&#xff1a;uniapp 开发工具&#xff1a;HBuilderX 3.99 前端首页代码 index.vue <!-- 源码下载地址 https://pan.baidu.com/s/1AVB71AjEX06wpc4wbcV_tQ?pwdl9zp --><template><view class&q…

新年送长辈礼物怎么选?华为畅享70 Pro 给长辈的新年贴心机

随着春节的脚步越来越近&#xff0c;我们也在为如何表达对长辈的关爱而烦恼。新年送礼&#xff0c;不仅要表达心意&#xff0c;更要考虑到长辈的需求和习惯。今天&#xff0c;我为大家带来一款特别适合长辈的礼物——华为畅享70 Pro。 首先&#xff0c;最直观的感受就是“大”。…

Docker部署Traefik结合内网穿透远程访问Dashboard界面

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

手机视频转换gif怎么操作?一个小妙招教你手机在线制gif

在现代社会gif动图已经是一种非常流行的图片格式了。可以通过视频转换gif的方式将自己的想法和创意制作成gif动图与好友进行分享斗图。那么&#xff0c;当我们想要在手机上完成视频转换成gif动图是应该怎么办呢&#xff1f;通过使用手机端的gif动图制作&#xff08;https://www…

uniapp 权限申请插件(权限使用说明) Ba-Permissions

简介&#xff08;下载地址&#xff09; Ba-Permissions 是一款权限申请插件&#xff0c;支持权限使用说明弹窗&#xff0c;满足市场审核需求。支持自定义权限申请&#xff0c;也支持快速申请定位、相机、媒体、文件、悬浮窗等常见权限。 支持权限使用说明弹窗&#xff0c;满足…

16 命令行模式

命令行模式 将行为的执行与与行为的调用通过命令分离&#xff0c;行为的的调用者不需要知道具体是哪个类执行的&#xff0c;他们之间通过命令连接。 demo的目录结构 命令的执行者&#xff08;接口&#xff09; package behavioralpattern.commandpattern.actuator;import ja…

el-tabs那些事

去除el-tab-pane的内边距 :deep(.el-tabs--border-card > .el-tabs__content) {padding: 0; }

VMware workstation安装Fedora-Server-39-1.5虚拟机并配置网络

VMware workstation安装Fedora-Server-39-1.5虚拟机并配置网络 Fedora包含的软件以自由及开放源码许可来发布&#xff0c;并旨在成为该技术领域的领先者。Fedora在专注创新、抢先集成新技术、与上游Linux社区紧密工作方面拥有良好名声。该文档适用于在VMware workstation平台安…