Laravel 框架中队列的使用

news2024/11/17 11:28:23

在这里插入图片描述

概述

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

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

安装

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

配置队列

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

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

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

例如:

QUEUE_CONNECTION=database

DB_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 方法来定义任务执行的逻辑。例如:

<?php

namespace 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.coloradmin.cn/o/1377405.html

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

相关文章

静态代理IP是如何助力跨境电商运营的?我的跨境电商发展史

跨境电商这几年的火爆程度已经不需要我多说什么了&#xff0c;我自己与跨境电商结缘还是无意之间在某乎上看了那种所谓的“0基础小白如何在家做跨境电商&#xff0c;副业月入XX&#xff0c;附选品指南&#xff01;”。 我不知道你们刷到过这种类似的帖子没有&#xff0c;当时…

InternLM第3节课笔记

基于 InternLM 和 LangChain 搭建你的知识库 1 大模型开发范式 LLM局限性&#xff1a;时效性、专业能力有限、定制化成本高 RAG&#xff08;检索、增强、生成&#xff09; 外挂知识库 微调 2 LangChain简介 LangChain 核心组成模块 Chains&#xff1a;组件组合实现端到…

MATLAB--pie函数绘制分类饼图(1)--附案例代码

MATLAB–pie函数绘制分类饼图&#xff08;1&#xff09; 目录 MATLAB--pie函数绘制分类饼图&#xff08;1&#xff09;摘要1. pie函数概述2. 使用pie函数绘制分类图的步骤步骤1&#xff1a;准备数据步骤2&#xff1a;调用pie函数步骤3&#xff1a;定制图形&#xff08;可选&…

杭州中科微 BDS/GNSS 全星座定位导航模块 ATGM332D-5N31使用笔记

一、BDS/GNSS 全星座定位导航模块 ATGM332D-5N31 介绍 ATGM332D-5N 系列模块是 12X16 尺寸的高性能 BDS/GNSS 全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗 GNSS SOC 单芯片—AT6558&#xff0c;支持多种卫星导航系统&#xff0c;包括中国的 BDS&a…

LeetCode+ 56 - 60

合并区间 双指针算法、位运算、离散化、区间合并_小雪菜本菜的博客-CSDN博客 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& a) {vector<vector<int>> res;if(a.empty()) return res;sort(a.begin(),a.en…

数据结构二叉树创建及例题(上)

今天就带领大家来到树的世界,树无论是在考试上还是实际学习方面都是比较重点的,大家在这块知识要花时间搞懂. 文章目录 前言 一、树的二叉链表定义 二、二叉树三种遍历方式(递归方式) 1.先序遍历方式(根左右) 2.中序遍历方式(左根右) 3.后序遍历方式(左右根) 三、二叉树的…

智能小程序小部件(Widget)开发详解

Widget 代表应用的一个小部件&#xff0c;负责小部件的展示和交互。 小部件(Widget) 的开发在智能小程序的基础上增加一个目录即可&#xff0c;用于存放小部件(Widget)的代码。并在 project.tuya.json 中增加一个声明。 创建小部件(Widget)项目 在 Tuya MiniApp Tools 中&…

强化学习应用(一):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

在windows11系统上利用docker搭建linux记录

我的windows11系统上&#xff0c;之前已经安装好了window版本的docker&#xff0c;没有安装的小伙伴需要去安装一下。 下面直接记录安装linux的步骤&#xff1a; 一、创建linux容器 1、拉取镜像 docker pull ubuntu 2、查看镜像 docker images 3、创建容器 docker run --…

Ubuntu 22.04 编译安装 Qt mysql驱动

参考自 Ubuntu20.04.3 QT5.15.2 MySQL驱动编译 Ubuntu 18.04 编译安装 Qt mysql驱动 下边这篇博客不是主要参考的, 但是似乎解决了我的难题(找不到 libmysqlclient.so) ubuntu18.04.2 LTS 系统关于Qt5.12.3 无法加载mysql驱动&#xff0c;需要重新编译MYSQL数据库驱动的问题以…

代码随想录算法训练营第六天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

刷题建议 刷题建议与debug 代码随想录目前基本都有了视频讲解&#xff0c;一定要先看视频&#xff0c;事半功倍。写博客&#xff0c;将自己的感悟沉淀下来&#xff0c;不然会忘大家提问的时候&#xff0c;记得要把问题描述清楚&#xff0c;自己在哪一步遇到了问题&#xff0c…

虚幻UE 材质-材质图层、材质图层混合

学习材质图层和材质图层混合的使用&#xff0c;便于节点扫盲。 文章目录 前言一、材质图层混合二、使用步骤总结 前言 材质混合我们之前用Bridge的插件进行混合过 而此次我们的材质混合使用UE自带的材质图层和材质图层混合来实现 一、材质图层混合 材质图层混合是一种允许将…

数据结构初阶之插入排序与希尔排序详解

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力,共赴大厂。 目录 一.前言 二.插入排序 …

jmeter分布式服务搭建

目录 一、环境准备 二、 安装包下载 三 、安装jdk 四 、控制机安装 4.1 解压压缩包 4.2 修改 bin/jmeter.properties 4.3 修改 bin/system.properties 五、执行机安装 5.1 解压安装包 5.2 修改 bin/jmeter.properties 5.3 修改 bin/system.properties 5.4 启动执行机 …

常见的AdX程序化广告交易模式有哪些?媒体如何选择恰当的交易模式?

程序化广告的核心目的是&#xff1a;让需求方能自由地选择流量与出价&#xff0c;程序化广告在数字广告投放中的主导地位日益巩固。 程序化广告“交易模式”有哪些&#xff1f;以下是详细解读&#xff0c;帮助媒体选择恰当的交易方式&#xff0c;从而实现广告价值的最大化。 …

python netCDF4

NetCDF简介 NetCDF 即 network Common Data Form&#xff08;网络通用数据格式&#xff09;&#xff0c;是一种面向数组型并适于网络共享的数据的描述和编码标准。文件的后缀是 .nc。nc 在气象领域应用很广&#xff0c;因为它可以存储不同波段的长时间观测结果。 NetCDF 文件…

全志V853 NPU开发之工具安装

V853支持最高1T NPU算力&#xff0c;在进行NPU相关开发前&#xff0c;需要先配置NPU开发环境。 Linux系统准备 NPU开发环境依赖于Linux系统&#xff0c;需要先准备 Linux 开发环境。 经测试NPU 工具支持下列 Linux 发行版&#xff1a; Ubuntu 20.04 其他部分 Linux 发行版…

基于python的室内老人实时摔倒智能监测系统(康复训练检测+代码)

概述 导入所需的库&#xff0c;包括cv2、和numpy。 定义了一个用于计算角度的函数calculate_angle(a, b, c)&#xff0c;其中a、b和c是三个关键点的坐标。 初始化姿态检测和绘图工具。 打开并读取视频文件。 -摔倒检测&#xff08;fallen&#xff09; 循环遍历视频的每一帧…

用友BI方案是干嘛的?能起到什么作用?

用友BI是一套用于无缝对接用友系统&#xff0c;让BI从用友系统中直接取数、分析&#xff0c;完成对企业数据的全面剖析&#xff0c;并为决策提供必不可少的支持的标准化方案。 为什么会有用友BI方案&#xff1f; 因为用友ERP和BI&#xff08;商业智能&#xff09;系统虽然都是…

uniapp开发安卓应用微信开放平台创建应用如何获取签名

微信开放平台创建应用时需要应用的签名 比如我们开发了一个应用叫 “滴滴拉屎” 包名&#xff1a;uni.DIDILASHI #mermaid-svg-BUKbltDr30J93dUs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BUKbltDr30J93dUs .…