广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >Laravel实现队列的示例代码
  • 617
分享到

Laravel实现队列的示例代码

Laravel实现队列Laravel 队列 2023-02-10 12:02:30 617人浏览 安东尼
摘要

目录一:队列配置1:队列相关配置2:不同队列依赖二:创建队列任务三:任务分发1:默认分发2:延时分发3:指定队列分发4:指定驱动分发5:指定驱动和队列分发四:任务处理五:失败任务处理

一:队列配置

队列的配置文件放置在config/queue.PHP文件中,laravel框架中支持的队列驱动有:sync, database, beanstalkd, sqs, Redis,null对应着:同步(本地使用)驱动,数据库驱动,beanstalkd ,Amazon SQS ,redis,null 队列驱动用于那些放弃队列的任务

1:队列相关配置

(1):队列驱动配置

'default' => env('QUEUE_DRIVER', 'sync'),//队列驱动设置

(2):不同驱动相关配置

'connections' => [
    syns驱动配置
    'sync' => [
        'driver' => 'sync',
    ],
    数据库驱动配置
    'database' => [
        'driver' => 'database',
        'table' => 'jobs',//数据库驱动配置使用的数据库
        'queue' => 'default',
        'retry_after' => 90,//指定了任务最多处理多少秒后就被当做失败重试,比如说,如果这个选项设置为 90,那么当这个任务持续执行了 90 秒而没有被删除,那么它将被释放回队列
    ],
    //beanstalkd驱动配置
    'beanstalkd' => [
        'driver' => 'beanstalkd',
        'host' => 'localhost',//使用beanstalkd驱动地址
        'queue' => 'default',
        'retry_after' => 90,//指定了任务最多处理多少秒后就被当做失败重试,比如说,如果这个选项设置为 90,那么当这个任务持续执行了 90 秒而没有被删除,那么它将被释放回队列
        'block_for' => 0,
    ],
    //sqs驱动配置
    'sqs' => [
        'driver' => 'sqs',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
        'queue' => env('SQS_QUEUE', 'your-queue-name'),
        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
    ],
    //redis驱动配置
    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',//使用哪个连接的redis,redis配置是在config/database.php文件中
        'queue' => env('REDIS_QUEUE', 'default'),
        'retry_after' => 90,
        'block_for' => null,
    ],
 
],

2:不同队列依赖

(1):数据库驱动

使用数据库驱动需要生成一个队列驱动表

php artisan queue:table
php artisan migrate

执行上面的命令之后会发现数据库中会增加一个jobs表

(2):redis驱动

使用redis驱动需要安装一个predis/predis 拓展

composer require predis/predis

(3):Amazon SQS驱动

使用Amazon SQS驱动时需要安装aws/aws-sdk-php拓展

composer require aws/aws-sdk-php

(4):Beanstalkd驱动

使用Beanstalkd驱动需要安装pda/pheanstalk拓展

composer require pda/pheanstalk

二:创建队列任务

php artisan make:job TestJobs

执行上面的命令创建一个队列任务类,这时候会发现在app/jobs目录下生成一个TestJobs.php文件

简单的队列任务类实例:

<?php
namespace App\Jobs;
use App\Models\blog\User;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class TestJobs implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
    public $tries = 5;
    
    public $timeout = 120;
    public $info;
    
    public function __construct($info)
    {
        //
        $this->info = $info;
    }
    
    public function handle()
    {
        //
        $user = new User();
        $user->user_no = $this->info['user_no'];
        $user->user_name = $this->info['user_name'];
        $user->save();
    }
}

三:任务分发

1:默认分发

$info = [
    'user_no'=>'006',
    'user_name'=>'testName'
];
TestJobs::dispatch($info);

2:延时分发

TestJobs::dispatch($info)->delay(Carbon::now()->addMinutes(10));//表示延时十分钟分发任务

3:指定队列分发

TestJobs::dispatch($info)->onQueue('processing');//表示使用默认驱动的processing队列

4:指定驱动分发

TestJobs::dispatch($info)->onConnection('redis');//使用redis驱动的默认队列

5:指定驱动和队列分发

TestJobs::dispatch($info)->onConnection('redis')->onQueue('processing');//使用redis驱动的processing队列

四:任务处理

php artisan queue:work

执行后我们会发现user表中发现多了一条user_no为006,user_name为testName数据,但是如果你指定了驱动和队列的话,这时候执行php artisan queue:work,你就会发现数据库中没有数据加进去,这是因为php artisan queue:work命令是对默认驱动和'default'队列监听,这时候就要使用:

php artisan queue:work redis --queue="processing"  //redis表示指定驱动 processing表示指定队列

五:失败任务处理

php artisan queue:failed-table
php artisan migrate

执行上面命令后会在数据库中增加一张failed_jobs表,专门用于存储失败的任务信息,在TestJobs类中添加一个failed方法处理失败队列


public function failed(Exception $exception)
{
    // 给用户发送失败通知,等等...
}

如果你想要注册一个只要当队列任务失败时就会被调用的事件,我们可以在 Laravel 的 app/Providers/AppServiceProvider.php文件中对这个事件附加一个回调函数即可


public function boot()
{
    Queue::failing(function (JobFailed $event) {
        // $event->connectionName
        // $event->job
        // $event->exception
    });
}

六:使用Supervisor管理队列

一旦使用queue:work 命令,它将一直运行,直到你手动停止或者你关闭控制台,如果你想要让queue:work 命令永久在后台运行,这时候可以使用进程监控工具Supervisor来实现永久在后台运行

1:Supervisor安装

Supervisor安装可以参考文末补充内容

2:配置Supervisor

(1):配置supervisord.conf

在/etc/supervisord.conf文件的最后一行增加

files = supervisord.d/*.ini

(2):队列进程配置

在/etc/supervisord.d/目录下创建一个.ini文件

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work database --sleep=3 --tries=3  #/home/forge/app.com为项目地址
autostart=true
autorestart=true
user=forge
numprocs=8 #numprocs 命令会要求 Supervisor 运行并监控 8 个 queue:work 进程
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

3:启动Supervisor

systemctl start supervisord.service
supervisorctl update
supervisorctl reload
supervisorctl start laravel-worker

补充

Linux下使用supervisor实现进程管理

最近在linux下写了一个脚本需要在linux后台一直运行,这里我使用了supervisor来实现脚本进程管理

supervisor安装

1:yum安装

yum install supervisor

2:pip安装

pip install supervisor

supervisor常用命令

supervisorctl status        //查看所有进程的状态
supervisorctl stop xx       //停止指定进程(all为所有进程)
supervisorctl start xx      //启动指定进程(all为所有进程)
supervisorctl restart       //重启
supervisorctl update        //配置文件修改后使用该命令加载新的配置
supervisorctl reload        //重新启动配置中的所有程序
systemctl start supervisord.service     //启动supervisor并加载默认配置文件
systemctl enable supervisord.service    //将supervisor加入开机启动项

将指定命令加入进程管理实例

1:supervisor配置

supervisor配置文件:/etc/supervisord.conf

子进程配置文件路径:/etc/supervisord.d/ (子进程的配置文件为ini格式)

我们增加一个命令到进程中只需要在子进程配置文件目录下创建一个ini进程文件进行配置即可

例:

vim /etc/supervisord.d/test.ini

在test.ini文件中加入如下命令:

[program:test]     #项目进程名称
dircetory=/XXX     #进程目录
command=XXX     #进程命令
autostart = true     #在supervisord启动的时候是否自动启动
autorestart=false     #程序退出后是否自动重启
#日志输出 
stderr_logfile=/tmp/client_stderr.log
stdout_logfile=/tmp/client_stdout.log
user=www     #脚本运行的用户身份 

2:将test进程加入进程管理

systemctl start supervisord.service
supervisorctl update
supervisorctl reload
supervisorctl start test

根据如上布置就可以实现将指定脚本加入进程管理

以上就是Laravel实现队列的示例代码的详细内容,更多关于Laravel队列的资料请关注编程网其它相关文章!

--结束END--

本文标题: Laravel实现队列的示例代码

本文链接: https://www.lsjlt.com/news/195468.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Laravel实现队列的示例代码
    目录一:队列配置1:队列相关配置2:不同队列依赖二:创建队列任务三:任务分发1:默认分发2:延时分发3:指定队列分发4:指定驱动分发5:指定驱动和队列分发四:任务处理五:失败任务处理...
    99+
    2023-02-10
    Laravel实现队列 Laravel 队列
  • Java代码实现循环队列的示例代码
    循环队列结构 队列特点 队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受...
    99+
    2022-11-12
  • PHP实现RabbitMQ消息列队的示例代码
    目录业务场景1、首先部署好thinkphp6框架2、安装workerman扩展3、生产者4、消费者5、整体测试业务场景 项目公司是主php做开发的,框架为thinkphp。众所周知,...
    99+
    2022-11-13
  • laravel源码分析队列Queue方法示例
    目录前言队列任务的创建队列任务的分发前言 队列 (Queue) 是 laravel 中比较常用的一个功能,队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求...
    99+
    2022-11-13
  • Java利用Redis实现消息队列的示例代码
    本文介绍了Java利用Redis实现消息队列的示例代码,分享给大家,具体如下:应用场景为什么要用redis?二进制存储、java序列化传输、IO连接数高、连接频繁一、序列化这里编写了一个java序列化的工具,主要是将对象转化为byt...
    99+
    2023-05-31
    java redis 消息队列
  • java中用数组实现环形队列的示例代码
    本篇文章主要讲述了使用数组实现环形队列的思路以及具体代码 一、队列是什么 我们先来看下百科的解释: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,...
    99+
    2022-11-12
  • Java语言通过三种方法实现队列的示例代码
    目录队列图解数组模拟队列队列优化—循环队列代码使用java内部队列代码队列 队列是一种特殊的线性表,只允许在表的前端进行删除操作,在表的后端进行插入操作。队列是一个有序列...
    99+
    2022-11-13
  • Java实现线程插队的示例代码
    目录多线程5(线程插队)1.题目2.解题思路3.代码详解多线程5(线程插队) 1.题目 在编写多线程的业务时,会遇到让一个线程优先于其他线程运行的情况,除了可以设置线程的优先级高于其...
    99+
    2022-11-13
  • python 队列详解及实例代码
    队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。 Queue模块最常与threading模块一起构成生产-消费者模型,提供了一个适用于多线程编程的先进...
    99+
    2022-06-04
    队列 详解 实例
  • C语言示例代码讲解栈与队列
    目录栈栈的定义顺序栈顺序栈的定义顺序栈的初始化顺序栈的入栈顺序栈的出栈取顺序栈的栈顶元素链栈队列队列的定义队列的顺序表达与实现队列顺序存储结构假溢出循环队列循环队列的初始化循环队列的...
    99+
    2022-11-13
  • 使用go实现一个超级mini的消息队列的示例代码
    目录前言目的设计协议队列broker删除消息生产者消费者启动总结前言 趁着有空余时间,就想着撸一个mini的生产-消费消息队列,说干就干了。自己是个javer,这次实现,特意...
    99+
    2022-06-07
    mini GO 队列 示例 消息队列
  • SpringBoot+RabbitMQ 实现死信队列的示例
    前言 死信:无法被消费的消息,称为死信。 如果死信一直留在队列中,会导致一直被消费,却从不消费成功。 所以我们专门开辟了一个来存放死信的队列,叫死信队列(DLX,dead-lette...
    99+
    2022-11-13
  • Go 实战单队列到优先级队列实现图文示例
    目录优先级队列概述为什么需要优先级队列优先级队列实现原理01 四个角色02 队列-消费者模式03 单队列-单消费者模式实现3.1 队列的实现3.2 工作单元--Job的实现3.3 消...
    99+
    2022-11-13
  • mysql实现自增序列的示例代码
    创建sequence表 CREATE TABLE `sequence` ( `name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列的名字',...
    99+
    2022-05-28
    mysql 自增序列
  • C++实现优先队列的示例详解
    目录前言堆的存储方式维护堆的方法1、上浮操作2、下沉操作附上代码前言 首先,啊,先简单介绍一下优先队列的概念,学数据结构以及出入算法竞赛的相信都对队列这一数据结构十分熟悉,这是一个线...
    99+
    2022-11-13
  • C语言实现队列的示例详解
    目录前言一. 什么是队列二. 使用什么来实现栈三. 队列的实现3.1头文件3.2 函数的实现四.完整代码前言 前一段时间,我们试着用C语言实现了数据结构中的顺序表,单链表,双向循环链...
    99+
    2022-11-13
  • C++代码实现链队列详解
    目录主要功能:完整代码展示:总结主要功能: 初始化、入队、出队、取队头元素、销毁队列、输出队列 完整代码展示: #include <iostream> using n...
    99+
    2022-11-12
  • go语言实现全排列的示例代码
    目录思路:回溯过程:代码:思路: 首先画出全排列的树形结构,以123为例,一开始排列为空列表,第一个位置有三种可能,分别是1、2、3,画出三个分支;由于第一个位置已经被占用,那么第二...
    99+
    2023-03-07
    go语言全排列
  • redis用list做消息队列的实现示例
    目录生产消息服务消费消息服务,定时任务日志测试leftPush消息入队,rightPop对应,消息出队。 rightPop(RedisConstant.MQ_LIST, 0L, Ti...
    99+
    2022-11-13
  • RabbitMQ实现WorkQueue工作队列的示例详解
    RabbitMQ Work Queue工作队列 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消...
    99+
    2023-01-10
    RabbitMQ Work Queue工作队列 RabbitMQ Work Queue RabbitMQ 工作队列
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作