贯彻职务队列的中坚配备和接纳,Laravel中使用

2019-06-29 18:20 来源:未知

前言

Laravel中选择Queue的最基本操作教程,laravelqueue

前言

laravel中的队列服务跟别的队列服务也未有啥两样,都以最适合人类观念的最简易最遍布的流水生产线:有二个地点存放队列消息,叁个PHP进度在运行时将职责写入,此外多少个PHP守护进度轮询队列音信,将直达试行供给的任务实施并剔除。由于PHP是url驱动的二头语言,本人是阻塞的,所以laravel提供叁个照看进度工具来查询并实行队列新闻也就相差为奇了。

那二日初次接触 Laravel 的行列,也是搞了好一会。。。一番折腾下来或许惊叹对 Laravel 不得其门,文书档案写的绝对简便易行和总结,看源码又有些不知所厝(不过看源码慢慢调节和测量检验验证照旧最保障的)。

下边是自家的三个简约 德姆o,仅仅使用了队列的最基本操作,偏高档的操作需求再去美丽时间一番 :)

和作者同一入门 Laravel 的队列某些不方便的同学能够沟通一下。

配置

添加 Redis 包

在 composer.json 中 require 部分投入 "predis/predis": "~1.0",,然后 composer up 更新一下就可以。

database.php

在 database.php 配置文件中对 redis 数据库部分开始展览配置,暗中认可有二个default 连接,就用这一个好了:)

依照这么些默许连接中必要的布局项,编辑 .env 配置文件,将内部的 REDIS_HOST、REDIS_PASSWORD、REDIS_PORT 填写成温馨服务器中 Redis 的相应值。

queue.php

先是供给去 .env 中配备 QUEUE_D奥迪Q3IVE君越,因为今后筹划用 Redis,所以布署成 redis。

继而安顿 queue.php 里 connections 部分的 redis 连接,在那之中 connection 对应的值就是 database.php 中 redis 的丰裕 default 连接。

任务类

接下去正是写实际的操作类了,Laravel 提供了 artisan 命令简化创建义务类:

php artisan make:job Demo

在 app 目录下会生成 Jobs 目录,里面早就有了 Demo.php 职分类。

Lumen 可不曾这么些 artisan 命令,但是也很方便,私下认可会有三个 ExampleJob.php 已经写好了,拷贝一份改个名字就可以。
先写个大致的日志输出测量检验一下好了,在 handle 方法中:

Log::info('Hello, queue');

发给任务

如今写个入口函数,推送任务到行列中。使用补助函数 dispatch():

Laravel 中运用如下格局:

Demo::dispatch();

Lumen 中动用如下情势:

dispatch(new Demo);

开启队列

顺手的话,那是最终一步了。命令行中试行:

php artisan queue:listen --queue=default

它会监听队列,并出口简单的实长势况,举个例子:

[2017-11-07 02:12:47] Processing: AppJobsDemo
[2017-11-07 02:12:47] Processed: AppJobsDemo

没啥难点后就足以让那么些队列脚本施行在后台:

php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1

进级一下 :)

推送到行列中时,一般会有传参的供给,那这里怎么传呢?

参数字传送递

传入

在入口函数中传出参数格局如下:

Laravel 中运用如下情势:

$param = 'Stephen';
Demo::dispatch($param);

Lumen 中采纳如下格局:

$param = 'Stephen';
dispatch(new Demo($param));

接收

在职分类中抽取参数情势如下:

protected $param;
/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($param)
{
  $this->param = $param;
}
/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
  Log::info('Hello, ' . $this->param);
}

第一尝试到此甘休,还应该有许多高端用法,比方延迟分发、错误管理、优先级、失利管理等,后续会一而再写 :)

多队列

那是贰个必然要求思念到的标题,我不可能将有所职分都位于一个叫 default 的种类中,那样不易于对队列实行处理。

要钦赐不相同的队列,极其简单,在 dispatch() 后接着跟上 onQueue() 方法就能够:

Demo::dispatch()->onQueue('emails');

畸形啊,笔者临近平昔不概念过这几个叫 emails 的 queue。嗯,自然要求做出一点改换,在 queue.php 配置文件中的 redis 配置 queue 从 default 改为 {default},这样做的效用就是队列的称呼能够从运维的时候动态得到,而不是写死的。

假如利用 Lumen 框架,那么直接这么写会报错:Call to a member function onQueue() on string。

由来在于 Lumen 的 Job 基类中并不曾选拔IlluminateFoundationBusDispatchable 那么些 trait,而是直接运用 IlluminateBusQueueable 中的 onQueue() 方法。

那正是说将来就很理解了,我们的 Job 类使用了 IlluminateBusQueueable 这几个trait,所以供给在 Job 类上调用那么些 onQueue() 方法。

$job = new XXXJob();
dispatch($job->onQueue('queue-name'));

当大家在开启队列的时候:

php artisan queue:work --queue=emails

那边钦定的系列名 emails 和 dispatch 时内定的行列名保持一致就能够。

总结

如上就是那篇小说的全体内容了,希望本文的源委对我们的上学也许干活有所一定的参阅学习价值,如若有疑点大家能够留言沟通,多谢大家对帮客之家的支撑。

仿照效法链接

Laravel 官方文书档案

前言 laravel中的队列服务跟别的队列服务也从未怎么差别,都是最适合人类观念的最简便最普...

1、概述
在Web开垦中,我们平日会遇上必要批量拍卖职务的场所,比如群发邮件、秒杀资格得到等,大家将这几个耗时要么高并发的操作放到队列中异步实践能够有效消除系统压力、提升系统响应速度和负载才具。

laravel中的队列服务跟任何队列服务也向来不什么样两样,都以最符合人类思维的最简便易行最常见的流程:有三个地方存放队列音信,一个PHP进度在运作时将职责写入,其它三个PHP守护进度轮询队列消息,将高达实行须要的天职试行并删除。由于PHP是url驱动的一道语言,本身是阻塞的,所以laravel提供二个护理进度工具来查询并实行队列音讯也就欠缺为奇了。

兑现队列有两种方法,Laravel也辅助各类行列完结驱动,比方数据库、Redis、Beanstalkd、IronMQ及亚马逊SQS等,此外还协理同步方式实现队列(暗中同意),以至将队列驱动装置为null表示不应用队列。Laravel为那个队列驱动提供了联合的接口,从而有利于大家随意切换驱动而无需更动职业逻辑编码,提供代码复用性。

这两日初次接触 Laravel 的行列,也是搞了好一会。。。一番煎熬下来或然惊叹对 Laravel 不得其门,文书档案写的相持简便易行和归纳,看源码又微微惊惶失措(然则看源码逐步调节和测验验证照旧最保障的)。

下面大家将以Redis驱动为例演示在Laravel怎么着实现队列创造、推送和实施。

下边是自家的三个轻松易行 德姆o,仅仅使用了队列的最基本操作,偏高端的操作必要再去好好时间一番 :)

2、配置文件
大家照例从布局文件起初,首先我们必要在陈设文件中配备暗中同意队列驱动为Redis,队列配置文件是config/queue.php:

和自己同样入门 Laravel 的队列某个不便的同校能够沟通一下。

return [

配置

    'default' => env('QUEUE_DRIVER', 'sync'),

添加 Redis 包

    'connections' => [
        'sync' => [
            'driver' => 'sync',
        ],
        'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'default',
            'expire' => 60,
        ],
        'beanstalkd' => [
            'driver' => 'beanstalkd',
            'host' => 'localhost',
            'queue' => 'default',
            'ttr' => 60,
        ],
        'sqs' => [
            'driver' => 'sqs',
            'key' => 'your-public-key',
            'secret' => 'your-secret-key',
            'queue' => 'your-queue-url',
            'region' => 'us-east-1',
        ],
        'iron' => [
            'driver' => 'iron',
            'host' => 'mq-aws-us-east-1.iron.io',
            'token' => 'your-token',
            'project' => 'your-project-id',
            'queue' => 'your-queue-name',
            'encrypt' => true,
        ],
        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => 'default',
            'expire' => 60,
        ],
    ],

在 composer.json 中 require 部分加入 "predis/predis": "~1.0",,然后 composer up 更新一下就可以。

    'failed' => [
        'database' => 'mysql', 'table' => 'failed_jobs',
    ],
];
该配置文件首先个布局项default用于钦赐暗中认可的种类驱动,这里我们将其值改为redis(实际上是修改.env中的QUEUE_DRIVER)。

database.php

connections配置项包蕴了Laravel支持的全部队列驱动,大家选拔Redis驱动,所以须求配置redis项:connection对应config/database.php中redis的default配置;queue为默许队列名称;expire为队列职分过期时间(秒)。这里大家能够保持其默许配置不变。

在 database.php 配置文件中对 redis 数据库部分开始展览安顿,暗中同意有三个default 连接,就用这几个好了:)

failed配置项用于配置战败队列义务存放的数据库及数据表。这里大家需求依据自个儿的数据库配置对其做相应修改。

依照那几个私下认可连接中供给的配置项,编辑 .env 配置文件,将里面包车型大巴REDIS_HOST、REDIS_PASSWORD、REDIS_PORT 填写成团结服务器中 Redis 的相应值。

3、编写队列职分
本例中,我们将演示一个给用户发送新成效提示邮件的事例。

queue.php

首先大家通过如下Artisan命令创造职分类:

先是须要去 .env 中布署 QUEUE_DCR-VIVE安德拉,因为后天企图用 Redis,所以安插成 redis。

php artisan make:job SendReminderEmail --queued
--queued选项表示生成的职责类完成了ShouldQueue接口,会被推送到行列而不是联合试行。

随后布置 queue.php 里 connections 部分的 redis 连接,当中 connection 对应的值正是 database.php 中 redis 的拾壹分 default 连接。

运作成功后会在app/Jobs目录下生成贰个SendReminderEmail.php,大家修改其剧情如下:

任务类

<?php
namespace AppJobs;

接下去正是写实际的操作类了,Laravel 提供了 artisan 命令简化创造职分类:

use AppJobsJob;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsBusSelfHandling;
use IlluminateContractsQueueShouldQueue;
use AppUser;
use IlluminateContractsMailMailer;
class SendReminderEmail extends Job implements SelfHandling, ShouldQueue
{

php artisan make:job Demo

    use InteractsWithQueue, SerializesModels;
    protected $user;
   
    /**
     * Create a new job instance.
     *
     * @return void
     */

在 app 目录下会转移 Jobs 目录,里面早就有了 德姆o.php 职务类。

    public function __construct(User $user)
    {
        $this->user = $user;
    }

Lumen 可未有这一个 artisan 命令,可是也很方便,暗许会有多少个 ExampleJob.php 已经写好了,拷贝一份改个名字就能够。
先写个简易的日记输出测验一下好了,在 handle 方法中:

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle(Mailer $mailer)
    {
        $user = $this->user;
        $mailer->send('emails.reminder',['user'=>$user],function($message) use ($user){
            $message->to($user->email)->subject('新功用揭橥');
        });
    }
}
此地大家运用正视注入引进了User和Mailer实例。User用于获取用户音信,Mailer用于发送邮件。这里的Mailer和前一节邮件发送中采纳的Mail门面有不约而合之效,它们最后调用的都以同三个类上的主意,这一个类正是IlluminateMailMailer。

Log::info('Hello, queue');

上面大家成立邮件局地视图resources/views/emails/reminder.blade.php:

发放任务

亲密的{{$user->name}},您好,Laravel大学新公布了XXX成效,马上去体验下吧:
<a href=";
编排好职责类之后我们来看怎么将职分推送到行列中:

近期写个入口函数,推送义务到行列中。使用支持函数 dispatch():

4、推送队列职务
手动分发职责

Laravel 中运用如下格局:

咱俩得以采纳调节器中的DispatchesJobstrait(该trait在调节器基类Controller.php中引进)提供的dispatch方法手动分发职分:

Demo::dispatch();

<?php

Lumen 中选取如下方式:

namespace AppHttpControllers;

dispatch(new Demo);

use IlluminateHttpRequest;
use AppHttpRequests;
use AppHttpControllersController;
use Mail;
use Storage;
use AppUser;
use AppJobsSendReminderEmail;

开启队列

class MailController extends Controller
{
    //其余方法

胜利的话,那是最终一步了。命令行中实践:

    //发送提示邮件
    public function sendReminderEmail(Request $request,$id){
        $user = AppUser::findOrFail($id);
        $this->dispatch(new SendReminderEmail($user));
    }
}
接下来在routes.php中定义路由:

php artisan queue:listen --queue=default

Route::get('mail/sendReminderEmail/{id}','MailController@sendReminderEmail');
运行队列监听器

它会监听队列,并出口轻巧的施行情状,譬喻:

在浏览器中做客

[2017-11-07 02:12:47] Processing: AppJobsDemo
[2017-11-07 02:12:47] Processed: AppJobsDemo

queue:work 暗中同意只实行一遍队列央浼, 当央求实施到位后就止住;
queue:listen 监听队列诉求,只要运维着,就能够一直接受央求,除非手动终止;
queue:work --daemon 同 listen 一样, 只要运营着,就能够一直接受供给,不一致样的地点是在这些运营格局下,当新的伸手到来的时候,不另行加载整个框架,而是间接fire 动作。能看出来, queue:work --daemon 是最高端的,一般推荐应用这些来拍卖队列监听。
注:使用 queue:work --daemon ,当更新代码的时候,必要截至,然后再度起动,那样本领把修改的代码应用上。
由此我们接下去在指令行中运维如下命令:

没啥难点后就能够让这几个行列脚本实践在后台:

php artisan queue:work --daemon
然后去查看邮箱会收到提示邮件:

php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1

Laravel中选用队列实现邮件发送

进级一下 :)

注:要保管任务施行成功,要求确认保障users表中id为1的记录email是二个灵光邮箱。
当然你可以在调节器之外的任哪个地方方选用dispatch分发职责,当然以前须求在此类中利用use DispatchesJobs。

推送到行列中时,一般会有传参的须要,那这里怎么传呢?

推送职务到钦赐队列

参数字传送递

上述操作将队列推送到默许队列,即安插文件中的default,当然你仍可以够将义务推送到钦定队列:

传入

public function sendReminderEmail(Request $request,$id){
    $user = AppUser::findOrFail($id);
    $job = (new SendReminderEmail($user))->onQueue('emails');
    $this->dispatch($job);
}
推迟任务施行

在入口函数中盛传参数方式如下:

除此而外,Laravel还协理延迟职责执行时间,这里我们钦赐延迟1分钟实施义务:

Laravel 中利用如下方式:

public function sendReminderEmail(Request $request,$id){
    $user = User::findOrFail($id);
    $job = (new SendReminderEmail($user))->delay(60);
    $this->dispatch($job);
}
从呼吁中散发职分

$param = 'Stephen';
Demo::dispatch($param);

此外,大家还是可以将HTTP诉求实例映射到任务中,然后从呼吁实例中取得参数填充任务类的构造函数,要是央求中不含有该参数,以致还足以传递额外参数,这足以通过DispatchesJobstrait提供的dispatchFrom方法来促成:

Lumen 中选用如下情势:

public function sendReminderEmail(Request $request,$id){
    $this->dispatchFrom('AppJobsSendReminderEmail',$request,['id'=>$id]);
}
自然大家需求对SendReminderEmail职务类的构造函数做如下修改:

$param = 'Stephen';
dispatch(new Demo($param));

public function __construct($id)
{
    $this->user = User::find($id);
}
构造函数中的$id就是从额外参数中收获到的。

接收

在职分类中接收参数格局如下:

protected $param;
/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($param)
{
  $this->param = $param;
}
/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
  Log::info('Hello, ' . $this->param);
}

初次尝试到此截至,还应该有众多高级用法,比方延迟分发、错误管理、优先级、退步管理等,后续会接二连三写 :)

多队列

那是贰个早晚需求思考到的标题,小编不容许将具有职分都坐落贰个叫 default 的行列中,那样不易于对队列进行保管。

要钦点差异的队列,极度简单,在 dispatch() 后随即跟上 onQueue() 方法就能够:

Demo::dispatch()->onQueue('emails');

畸形啊,小编就像平昔不概念过那一个叫 emails 的 queue。嗯,自然要求做出一点改造,在 queue.php 配置文件中的 redis 配置 queue 从 default 改为 {default},这样做的功效正是队列的称谓能够从运营的时候动态获得,而不是写死的。

如果选取 Lumen 框架,那么直接这么写会报错:Call to a member function onQueue() on string。

原因在于 Lumen 的 Job 基类中并不曾应用 IlluminateFoundationBusDispatchable 那几个 trait,而是径直行使 IlluminateBusQueueable 中的 onQueue() 方法。

那么今后就很领会了,大家的 Job 类使用了 IlluminateBusQueueable 那些trait,所以必要在 Job 类上调用那个 onQueue() 方法。

$job = new XXXJob();
dispatch($job->onQueue('queue-name'));

当大家在开启队列的时候:

php artisan queue:work --queue=emails

此间内定的行列名 emails 和 dispatch 时内定的队列名保持一致就能够。

总结

如上便是那篇小说的全体内容了,希望本文的源委对大家的求学恐怕专门的工作富有一定的参照学习价值,若是有疑问我们可以留言交换,感谢大家对台本之家的帮忙。

参照链接

Laravel 官方文书档案

您或许感兴趣的作品:

  • PHP的Laravel框架中使用音讯队列queue及异步队列的方法
  • Laravel 4.第22中学队列服务(queue)使用感受
版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于网络编程,转载请注明出处:贯彻职务队列的中坚配备和接纳,Laravel中使用