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.rhkb.cn/news/238638.html

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

相关文章

二分图带权最大匹配-KM算法详解

文章目录 零、前言一、红娘再牵线二、二分图带权最大完备匹配2.1二分图带权最大匹配2.2概念2.3KM算法2.3.1交错树2.3.2顶标2.3.3相等子图2.3.4算法原理2.3.5算法实现 三、OJ练习3.1奔小康赚大钱3.2Ants 零、前言 关于二分图&#xff1a;二分图及染色法判定-CSDN博客 关于二分…

企业销售获客难?分享一个精准筛查企业客户的技巧

作为企业销售经理&#xff0c;曾经一直让我们很头疼的问题之一就是获客困难。回想起以往&#xff0c;我们需要通过各种手段&#xff0c;手动查找电话名单、网络搜索到各种渠道&#xff0c;费尽心思的去筛查才能找到潜在客户。获客流程长还耗费很多的精力&#xff0c;拿到手的客…

面试宝典进阶之Java线程面试题

T1、【初级】线程和进程有什么区别&#xff1f; &#xff08;1&#xff09;线程是CPU调度的最小单位&#xff0c;进程是计算分配资源的最小单位。 &#xff08;2&#xff09;一个进程至少要有一个线程。 &#xff08;3&#xff09;进程之间的内存是隔离的&#xff0c;而同一个…

源码搭建教学:连锁餐饮APP开发实战

连锁餐饮APP&#xff0c;对于很多从事餐饮行业的人来说不会陌生&#xff0c;同样这个项目本身就有着很高的热度。今天&#xff0c;小编将深入为大家讲述一下此系统的前后端开发、数据库设计、用户界面设计等方面&#xff0c;让您深入了解全栈开发的方方面面。 一、项目准备与规…

一、QT的前世今

一、Qt是什么 1、Qt 是一个1991年由奇趣科技开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;比如控制台工具和服务。 2、Qt是面向对象的框架&#xff0c;具有面向对象语言的特性&#xff1a;封装、继承、多态。…

Unity2022.3打包Android后从AB包加载场景发现丢失大量脚本问题

问题 这两天遇到一个问题&#xff0c;在VR项目打包Android的时候&#xff0c;加载场景后&#xff0c;Timeline工作不正常&#xff0c;找不到原因。 现象 看到有很多警告&#xff0c;丢失脚本的Log。 因为场景本身也有一些丢失的脚本所以没在意&#xff0c;但是又不是所有脚本…

6.3、SDN在云计算中的应用

目录 一、SDN概念 1.1、传统网络机制 1.2、SDN网络机制 1.3、二者区别 1.4、SDN架构 二、云数据中心 2.1、公有云环境特点 2.2、两大挑战 2.3、云数据中心引入SDN技术解决两大挑战 三、SDN云计算解决方案 3.1、SDN云计算解决方案之控制平面openflow协议 3.1.…

Android studio调试

Android Studio连接手机详细教程(包含遇到的问题集)_android studio 连接手机-CSDN博客 可以创建虚拟机或直连真机或直连模拟器。 无法打开本地终端 Android studio Failed to start [powershell.exe] 利用Android studio的adb命令删除app应用 - 简书 利用ADB工具免root停用A…

深入理解 go chan

go 里面&#xff0c;在实际程序运行的过程中&#xff0c;往往会有很多协程在执行&#xff0c;通过启动多个协程的方式&#xff0c;我们可以更高效地利用系统资源。 而不同协程之间往往需要进行通信&#xff0c;不同于以往多线程程序的那种通信方式&#xff0c;在 go 里面是通过…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-2 常用表单控件

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>常用表单控件</title> <style> form {width: 260px;margin: 0 auto;border: 1px solid #ccc;padding: 20px; } .right {float: right; } </style&g…

Windows系统搭建WebDAV服务并结合内网穿透实现公网访问本地文件

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

阿尔泰科技——PXIe8912/8914/8916高速数据采集卡

阿尔泰科技PXIe8912/8914/8916高速数据采集卡是2通道同步采样数字化仪&#xff0c;专为输入信号高达 100M 的高频和高动态范围的信号而设计。 与Labview无缝连接&#xff0c;提供图形化API函数。模拟输入范围可以通过软件编程设置为1V 或者5V。配备了容量高达 2GB的板载内存。…

亚马逊实时 AI 编程助手 CodeWhisperer使用体验

文章目录 1&#xff1a;什么是CodeWhisperer &#xff1f;2&#xff1a;试用3&#xff1a;上手体验 1&#xff1a;什么是CodeWhisperer &#xff1f; 最近ChatGPT展现出强大AI能力给我们带来了深刻的影响&#xff0c;AI现在不是一个概念&#xff0c;基于AI的产品一定在各行各业…

Elasticsearch 地理空间搜索 - 远超 OpenSearch

作者&#xff1a;来自 Elastic Nathan_Reese 2021 年&#xff0c;OpenSearch 和 OpenSearch Dashboards 开始作为 Elasticsearch 和 Kibana 的分支。 尽管 OpenSearch 和 OpenSearch Dashboards 具有相似的血统&#xff0c;但它们不提供相同的功能。 在分叉时&#xff0c;只能克…

喜好儿AI周报Weekly(第9期)CES2024 AI产业大爆发 | Rabbit R1 | 3D-Fauna | OLED屏幕 | Genie | MagicVideoV2 | Magnific

各位观众朋友们大家好&#xff01;我是被老板派去出差逛CES2024 拉斯维加斯消费电子展差点迷路回不来的阿喜。一起去看看这一周有什么新鲜事吧。 本期导读&#xff1a; 逛逛CES 2024消费电子展Rabbit R1人工智能设备三星AI机器人BallieLG无线透明OLED屏幕Portalgraph VR空间投…

jmeter和meterSphere如何使用第三方jar包

引用jar包语言使用的都是beanshell 问题起因&#xff1a;metersphere 接口自动化实现过程中&#xff0c;如何实现字符串加密且加密方法依赖第三方库&#xff1b; 使用语言&#xff1a;beanshell脚本语言&#xff0c;java语言 使用工具&#xff1a;idea jmeter metersphere 1.…

如何分析测试任务及需求(附分析流程)

测试分析 确认测试范围 根据测试项目的不同需求&#xff0c;有大致几类测试项目类型&#xff1a;商户/平台功能测试、支付方式接入测试、架构调整类测试、后台优化测试、性能测试、基本功能自动化测试。 测试项目需要按照文档要求进行测试需求分析&#xff0c;并给出对应的输出…

【论文阅读 CIDR17】Self-Driving Database Management Systems

Self-Driving Database Management Systems MySummary ABSTRACT 之前的advisory tools来帮助DBA处理系统调优和物理设计的各个方面&#xff0c;都仍然需要人类对数据库的任何更改做出最终决定&#xff0c;并且是在问题发生后修复问题的反动措施reactionary measures 。 An …

Linux进程【2】进程地址空间(+页表详解哦)

fork 引言&#xff08;程序地址空间&#xff09;进程地址空间进程地址空间mm_struct 虚拟地址到物理地址的转化总结 引言&#xff08;程序地址空间&#xff09; 在之前的学习过程中&#xff0c;我们认识了内存与地址&#xff0c;并且了解了在程序地址空间中的基本分区&#xf…

three.js 使用 tweenjs绘制相机运动动画

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…