Lumen -- 队列 - 简书


本站和网页 https://www.jianshu.com/p/6ce4cc6b4ff2 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Lumen -- 队列 - 简书登录注册写文章首页下载APP会员IT技术Lumen -- 队列Amy1234567关注赞赏支持Lumen -- 队列一,构建1. lumen利用Laravel的队列组件为各种不同的队列服务提供统一的API。队列允许将耗时任务(例如发送电子邮件)的处理推迟到稍后的时间,从而大大加快了对应用程序的web请求。lumen和laravel提供了数据库,Beanstalked, IronMQ, Amazon SQS, Redis, null, 和同步队列驱动(供本地使用)的支持。空队列驱动程序只是丢弃队列的作业,因此它们永远不会运行。2. .env文件中的QUEUE_DRIVER选项决定了应用程序将使用的队列驱动。例如:
QUEUE_DRIVER=redis
QUEUE_REDIS_CONNECTION=redis_queue
3. 为了使用数据库队列驱动程序,您需要一个数据库表来保存作业。表架构应如下所示:
手册
4. 其他队列依赖队列驱动程序需要以下依赖项: Amazon SQS: aws/aws-sdk-php Beanstalkd: pda/pheanstalk~3.0 IronMQ: iron-io/iron_mq~1.5 Redis: predis/predis~1.0二, 基本用法1. 推送一个作业到队列中应用程序的所有可排队作业都存储在 App\Jobs 目录中。基类 App\Job 可以作为其余任务的基类。注意:如果您打算使用 Queue facade,请务必取消注释 bootstrap/app.php 文件中的 $app->withFacades() 调用。2. 要将新作业推送到队列中,请使用 Queue::push 方法:Queue::push(newSendEmail($message));你也可以使用闭包路由或控制器的 dispatch 方法:$this->dispatch(newSendEmail($message));3. 当作业被队列执行时,作业的句柄方法将被调用。您可以在句柄方法上键入提示您需要的任何依赖项,服务容器将自动注入它们:
手册
4. 为作业(job)指定队列(queue)/TubeQueue::pushOn('emails',newSendEmail($message));5. 将相同的负载(payload)传递给多个作业(job)如果您需要将相同的数据传递给多个队列作业(queue job),您可以使用 Queue::bulk 方法:Queue::bulk([newSendEmail($message),newAnotherCommand]);6. 延迟作业的执行有时您可能希望延迟正在排队的队列作业的执行。例如,您可能希望注册一个15 分钟后将向客户发送电子邮件的队列作业。您可以使用 Queue::later 方法完成此操作:
$date=Carbon::now()->addMinutes(15);
Queue::later($date, newSendEmail($message));
在此示例中,我们使用 Carbon 日期库来指定我们希望分配给作业的延迟。或者,您可以将希望延迟的秒数作为整数传递。7. 队列和 Eloquent 模型(Queues And Eloquent Models)如果您的队列作业在其构造函数中接受 Eloquent Model,则只有模型的标识符将被序列化到队列中。当实际处理作业时,队列系统会自动从数据库中重新检索完整的模型实例。这对您的应用程序完全透明,并且可以防止序列化完整的 Eloquent 模型实例可能出现的问题。8. 删除已处理的队列作业处理完作业后,必须将其从队列中删除。如果在你的工作执行过程中没有抛出异常,这将自动完成。如果您想手动删除或释放作业,Illuminate\Queue\InteractsWithQueue trait 提供对队列任务释放和删除方法的访问。 release 方法接受一个值:您希望等待作业再次可用的秒数。
手册
9. 将任务释放回队列如果正在处理的任务发生了异常,它将自动释放回队列,以便再次尝试。该任务将继续释放,直到应用程序允许的最大尝试次数。最大尝试次数由---- Artisan任务:queue:listen或queue:work 使用的tries开关定义10. 检查尝试运行次数如果正在处理的任务发生异常,它将自动释放回队列。您可以尝试方法检查运行任务的尝试次数:
if($this->attempts() > 3){
注意:您的任务/句柄必须引用Illuminate\Queue\InteractsWithQueue才能调用此方法三,更多调度方法从请求映射命令属性将HTTP请求变量映射到任务(jobs)中是非常常见的。因此lumen提供了一些辅助方法,使其成为一种便捷的方式,而不是强制您为每个请求手动执行此操作。让我们看一下来自闭包路由和控制器方法的dispatchFrom 方法$this->dispatchFrom('Command\Class\Name',$request);此方法将检查任务类的构造函数,然后从HTTP请求(或任何其他ArrayAccess对象)中提取变量,以填充任务所需的构造函数参数。因此,如果我们的任务类在其构造函数中接受firstName变量,任务总线将尝试从HTTP请求中提取firstName参数。还可以将数组作为第三个参数传递给dispatchFrom方法。此数组将用于填充请求中不可用的任何构造函数参数:
$this->dispatchFrom('Command\Class\Name',$request,[
    'firstName'=>'Taylor',
]);
四,排队闭包注意:在对闭包进行排队之前,需要添加jeremeamia/superclosure (~2.0)到composer.json文件中您还可以将闭包推到队列上。这对于需要排队的快速简单任务非常方便:将闭包推到队列上
Queue::push(function($job) use($id){
    Account::delete($id);
    $job->delete();
});
注意:不要通过使用指令使闭包队列对象可用,请考虑传递主键并从队列作业中重新提取相关模型。这通常可以避免意外的序列化行为。当使用Iron.io推送队列时,你应该采取额外的预防措施排队闭包。接收队列消息的端点(end-point)应该检查token,以验证请求实际上来自Iron.io。例如,推送队列的端点(end-point)应该是:https://yourapp.com/queue/receive?token=SecretToken。然后,您可以在封送(marshalling)队列请求之前检查应用程序中的秘密令牌(secret token)的值。五,运行队列监听器
Lumen和Laravel一样,包括一个Artisan任务,当新作业被推到队列中时,该任务将运行新作业。您可以通过使用queue:listen运行此任务1. 开启队列监听器php artisan queue:listen您还可以指定监听器应使用的队列连接:php artisan queue:listen connection请注意,一旦此任务启动,它将继续运行,直到手动停止。您可以使用进程监视器(如Supervisor)来确保队列监听器不会停止运行。您可以将以逗号分隔的队列连接列表传递给监听器作业,以设置队列优先级:php artisan queue:listen--queue=high,low在本例中,高连接(high-connection)上的作业将始终在从低连接(low-connection)转移到作业之前进行处理。2. 指定作业超时参数您还可以设置每个作业应允许运行的时间长度(以秒为单位):php artisan queue:listen--timeout=603. 指定队列睡眠持续时间此外,您可以指定在轮询新作业之前等待的秒数:php artisan queue:listen--sleep=5请注意,只有当队列中没有作业时,队列才会“休眠”。如果有更多的作业可用,队列将继续工作而不“休眠”。4. 正在处理队列上的第一个作业要仅处理队列上的第一个作业,可以使用queue:work作业php artisan queue:work六,守护进程队列工作程序
queue:work还包括一个--daemon选项,用于强制queue worker在不重新启动框架的情况下继续处理作业。与queue:listen作业相比,这会显著减少CPU使用量。要在守护程序模式下启动队列工作程序,请使用--daemon标志:
php artisan queue:work connection--daemon
php artisan queue:work connection--daemon--sleep=3
php artisan queue:work connection--daemon--sleep=3--tries=3
如您所见,queue:work作业支持queue:listen可用的大部分相同选项。您可以使用php artisan help queue:work job查看所有可用选项。1. 使用守护进程队列工作程序部署使用守护进程队列工作程序部署应用程序的最简单方法是在部署开始时将应用程序置于维护模式。这可以使用php artisan down作业来完成。一旦应用程序处于维护模式,Lumen和Laravel将不接受队列外的任何新作业,但将继续处理现有作业。重启workers的最简单方法是在部署脚本中包含以下作业:php artisan queue:restart此作业将指示所有队列在完成当前作业的处理后重新启动。注意:此作业依赖缓存系统来安排重新启动。默认情况下,APCu不适用于CLI作业。如果您正在使用APCu,请在APCu配置添加apc.enable_cli=1。2. 为守护进程队列工作程序编写代码守护进程队列工作程序在处理每个作业之前不会重新启动框架。因此,在工作完成之前,你应该小心地释放任何沉重的资源。例如,如果您正在使用GD库进行图像处理,那么在完成操作时,应该使用imagedestroy 释放内存。类似地,当被长时间运行的守护程序使用时,数据库连接可能会断开。您可以使用DB::reconnect方法来确保有一个新的连接。七,失败作业由于事情并不总是按计划进行,有时排队的作业会失败。Lumen和Laravel提供了一种方便的方法来指定作业的最大尝试次数。作业超过此尝试次数后,它将被插入failed_jobs表中。1. failed_jobs表应具有如下模式:
Schema::create('failed_jobs',function(Blueprint$table)
    $table->increments('id');
    $table->text('connection');
    $table->text('queue');
    $table->text('payload');
    $table->timestamp('failed_at');
});
2. 您可以通过使用queue:listen作业上使用--tries开关,指定作业的最大尝试次数:php artisan queue:listen connection-name--tries=33. 如果要注册队列作业失败时将调用的事件,可以使用Queue::failing方法。这个事件是通过电子邮件或HipChat通知团队的绝佳机会。
Queue::failing(function($connection,$job,$data){
 });
4. 您还可以直接在队列作业类上定义失败的方法,以便在发生故障时执行特定操作:
public function failed()
    // Called when the job is failing...
5. 重试失败作业要查看所有失败作业,你可以使用Artisan作业:queue:failedphp artisan queue:failed queue:failed将列出作业ID、连接、队列和失败时间。作业ID可用于重试失败的作业。例如,要重试ID为5的失败作业,应发出以下作业:php artisan queue:retry 5如果要删除一个失败队列,可以使用queue:forget作业:php artisan queue:forget 5要删除所有的失败队列,可以使用queue:flush作业:php artisan queue:flush推荐阅读更多精彩内容lumen队列执行无反应版本:lumen5.6 出现问题:执行 artisan queue:work OR artisan queue:...清风知明月阅读 1,419评论 0赞 1laravel/Lumen队列laravel队列 配置 配置文件 config/queue.php 中添加代码 配置文件 config/data...大口吃饭大口吐阅读 455评论 0赞 0laravel mysql实现队列1迁移需要的数据表 配置 修改.env文件,队列支持"sync", "database", "beanstalkd...零一间阅读 1,537评论 0赞 0简单使用lumen队列需求:在项目中,需要采集文章并把文章中的图片本地化/更新到oss中。如果按照以往的方式,直来直往地采集并替换到图片...KoPa阅读 1,655评论 0赞 0laravel4.2中队列的使用queue:listen和queue:work 区别 queue:work 默认只执行一次队列请求, 当请求执行完...木十2036阅读 615评论 0赞 0laravel 基础教程 —— 队列队列 简介 laravel 的队列服务对各种不同的后台队列服务提供了统一的 API。队列允许你延迟执行消耗时间的任...Dearmadman阅读 20,285评论 7赞 25Laravel database队列使用https://laravelacademy.org/post/19553.html 1.修改ENV文件 设置队列...会飞的兔子zy阅读 307评论 0赞 0laravel - 队列(三)1、为什么使用队列?异步、重试 2、什么情况使用队列?(1)、耗时比较久的,比如上传一个文件后进行一些格式的转化等...程序员工作随笔阅读 301评论 0赞 0Laravel5中队列的redis配置队列常常用于两种场景,一种是高并发的情况,一种是耗时的操作,可以将任务放到队列中去,消费者从队列取任务执行,当然还...金星show阅读 1,456评论 2赞 0Laravel中使用队列Laravel中使用队列 官方教程 ## 安装依赖扩展包 composer require"predis/pred...RwatitFahsa阅读 536评论 0赞 0Laravel5.8 队列的使用与监控队列 Laravel5 使用队列可以异步执行消耗时间的任务,降低请求的响应时间 安装队列驱动 根据你自己的需求安装...3132阅读 1,200评论 0赞 1Laravel 队列queue(database篇)队列 Laravel队列服务为各种不同的后台队列提供统一的API允许推迟耗时任务(例如发送邮件)的执行,从而大幅提...快点跑哇阅读 3,729评论 0赞 1Laravel&Lumen系统之队列服务一般而言有些会阻塞运行程序的任务,我们会采用队列服务已经异步调用,这样可以实现非阻塞服务。之前有个需求是调用支付宝...瑛民星阅读 2,535评论 0赞 2laravel 队列什么是队列,队列用来干什么的这里不再介绍! 这里使用数据库作为驱动,php artisan queue:table...小小小胡阅读 273评论 0赞 0分析Laravel队列实现原理解决问题记录问题 公司项目使用Laravel的开发的两个项目在同一个测试服务器部署,公用同一个redis。在使用laravel...Dr點燃阅读 1,447评论 2赞 9生活不曾给人希望,却常常让人失望 我印象里,身边的老人们,总喜欢把一句话挂在嘴边:“生活不如意事,十之八九!人嘛,总得,自己学会适应生活!”...cf96731e55b0阅读 1,420评论 0赞 42021-3-8晨间日记今天是第三周周一,三八女神节祝自己每天开心一点,工作顺心顺意 起床:4:25 就寝:23:56 天气:雨天 心情:...QXCLZ阅读 950评论 1赞 3💎【利平成长日记】第641天张利平2021.3.6「学习《情绪按钮》第20天收获: [太阳]今天学习内容: 第七章《情绪的来源》(五)情绪的来...张利平专注国学教育139876阅读 4,396评论 2赞 3追梦记2 .0这周的作文题目是:假设你现在在火车上,对面坐着一个漂亮的异性,去构思一段故事,想想接下来会发生什么。那么接下来我的...2077516阅读 2,339评论 3赞 0《禅·茶·心》(二十四)参话头:和问题相处得久一点人们问爱因斯坦为何能在1905年提出那么多改变人类认识世界的理论,他谦虚地回答道: “并不是我很聪明,只是我和问题...世界和平_众生安康阅读 4,982评论 0赞 10评论0赞赞1赞赞赏更多好文