首页 > 作文

Laravel框架中队列和工作(Queues、Jobs)操作实例详解

更新时间:2023-04-08 16:33:43 阅读: 评论:0

在我们的web应用中,经常会遇到这样的情况:

用户在进行了某项操作后,我们需要在后台完成一个耗时且耗费资源的任务,以对应用户的操作。

通常来说,web应用中的操作都是同步的(synchronous),即用户的操作可以立即得到回馈。

但是在以上情况下,同步等待操作结果将是灾难性的。比如用户点击了申请密码重置邮件,倘若我们让用户一直停滞在等待页面,直至邮件发送成功,那么用户体验将非常地不好,因为有时候可能需要很长的时间才能将邮件发送完成。

从另一个角度来说,如果我们服务器处于高负荷的情况,当多个用户同时请求发送邮件等操作时,我们不希望同时地给服务器增加负荷,否则可能会导致服务器崩溃,造成无法预估的情况。

从以上的讨论可以看出,我们需要一种机制,可以非同步地响应用户操作,并且不会给服务器增加过大的负荷。

那么这样一种机制就是queues和jobs(即队列和工作)。

如果你系统地学习过计算机科学,那么队列的概念你应该不陌生。假设我们去银行办事,我们拿了一个号,发现前面有8个人在等待,那么我们实际上就处在一个队列之中,队列中靠前的人会先被叫到号码,并且叫号的顺序即拿号的顺序。这样的队列就叫做queue,采用的是先到先处理的方式,不允许插队的情况存在。而我们要办的事情就叫job。

在laravel中,我们可以很方便地使用queues及jobs来达到我们的目的。首先我们需要先来看一下,laravel中有哪些queues。

打开config/queue.php,我们可以看到几种常见的队列设置:

return [          /*        |-------------党员民评自我评价2019-------------------------------------------------------------        | default queue connectio化学反应类型有哪些n name        |--------------------------------------------------------------------------        |        | laravel's queue api supports an assortment of back-ends via a single        | api, giving you convenient access to each back-end using the same        | syntax for every one. here you may define a default connection.        |        */          'default' => env('queue_driver', 'sync'),          /*        |--------------------------------------------------------------------------        | queue connections        |--------------------------------------------------------------------------        |        | here you m兵检要求ay configure the connection information for each rver that        | is ud by your application. a default configuration has been added        | for each back-end shipped with laravel. you are free to add more.        |        | drivers: "sync", "databa", "beanstalkd", "sqs", "redis", "null"        |        */          'connections' => [            'sync' => [            'driver' => 'sync',          ],            'databa' => [            'driver' => 'databa',            'table' => 'jobs',            'queue' => 'default',            'retry_after' => 90,          ],            'beanstalkd' => [            'drive海螺的做法煮多长时间r' => 'beanstalkd',            'host' => 'localhost',            'queue' => 'default',            'retry_after' => 90,          ],            'sqs' => [            'driver' => 'sqs',            'key' => env('sqs_key', 'your-public-key'),            'cret' => env('sqs_cret', 'your-cret-key'),            'prefix' => env('sqs_prefix', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),            'queue' => env('sqs_queue', 'your-queue-name'),            'region' => env('sqs_region', 'us-east-1'),          ],            'redis' => [            'driver' => 'redis',            'connection' => 'default',            'queue' => 'default',            'retry_after' => 90,            'block_for' => null,          ],          ],          /*        |--------------------------------------------------------------------------        | failed queue jobs        |--------------------------------------------------------------------------        |        | the options configure the behavior of failed queue job logging so you        | can control which databa and table are ud to store the jobs that        | have failed. you may change them to any databa / table you wish.        |        */          'failed' => [          'databa' => env('db_connection', 'mysql'),          'table' => 'failed_jobs',        ],        ];

在connections中,我们看到sync这个连接。sync是laravel默认的队列,代表的就是synchronous,即同步队列。

今天我们要来看一下,如何使用databa,即数据库来实现异步任务处理。

要使用databa来作为队列的内部实现机制,我们需要建立一张用于储存jobs的表:

$ php artisan queue:table     $ php artisan migrate

以上命令将会在数据库创建名为jobs的表。

队列我们有了,那么现在我们来看一下jobs。laravel中jobs文件默认位置在app/jobs文件夹下,我们可以通过make:job这个artisan命令快速创建我们的job类:

$ php artisan make:job ndemail

生成的job会实现illuminate\contracts\queue\shouldqueue这个接口,表明生成的job对象将被推到队列中进行异步处理。

job类其实很简单,里面只有一个名为handle的方法,该方法在job被queue处理的时候自动被调用。

在上面的命令中,我们创建了一个名为ndemail的类:

<?php      namespace app\jobs;      u app\email; 安徽专科学校   u illuminate\bus\queueable;    u illuminate\queue\rializesmodels;    u illuminate\queue\interactswithqueue;    u illuminate\contracts\queue\shouldqueue;    u illuminate\foundation\bus\dispatchable;      class ndemail implements shouldqueue    {      u dispatchable, interactswithqueue, queueable, rializesmodels;        protected $email;        /**       * create a new job instance.       *       * @param podcast $podcast       * @return void       */      public function __construct(email $email)      {        $this->email = $email;      }        /**       * execute the job.       *       * @param audioprocessor $processor       * @return void       */      public function handle()      {        // process email and nd the email to recipient(s)        // 这里我们可以处理我们的邮件并将邮件发送至接收人   }    }

可以看到,我们可以将model传递进job的constructor中。laravel会自动序列化(rialize)模型的识别信息,在job真正被处理的时候,完整的模型数据才会被从数据库调用出来。另外,在handle方法中,我们也可以注入我们的依赖dependencies。

好了,现在我们有了job类,可以创建job对象了,那么如何把job添加进队列呢?

在我们的控制器中,我们可以调用job的dispatch方法来将其添加进队列中:

<?php    namespace app\http\controllers;    u app\jobs\ndemail;  u illuminate\http\request;  u app\http\controllers\controller;  u app\email;   class emailscontroller extends controller  {    /**     * store a new email.     *     * @param request $request     * @return respon     */    public function nd(request $request)    {      // create email...      // 这里我们提取email信息并创建$email, email是我们自定义的model     $email = email::create($request->only('nder', 'to', 'content'));       ndemail::dispatch($email);    }  }

这样一来,每当我们的控制器调用nd方法时,就会创建一个ndemail的job在数据库中。

那么怎么样调用queue worker来处理我们的jobs呢?

在.env文件中,我们将queue_driver=sync改为queue_driver=databa。

接下来,我们运行以下artisan命令:

$ php artisan queue:work

队列的worker会一直运行,每当有任务被添加进数据库jobs表中,worker便会自动抓取出任务进行处理。当任务失败时,worker会重复执行任务,直至最大尝试次数(默认为255)。我们可以手动设置最大尝试次数:

$ php artisan queue:work --tries=3

当然,我们也可以手动设置任务的超时(默认90s,在config/queue.php中的retry_after设置):

$ php artisan queue:work --timeout=30

最后,当没有任务的时候,我们可以设置一个睡眠时间,当worker在睡眠时间时,将不会处理任务:

$ php artisan queue:work --sleep=10

上面的命令意思是每当worker处理完所有任务后,会睡眠10s,然后才会再次检查任务队列

本文使用laravel 5.6进行讲解

本文主要讲解了laravel框架中队列和工作(queues、jobs)操作实例详解,更多关于laravel框架的使用技巧请查看下面的相关链接

本文发布于:2023-04-08 16:33:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/b436dc9eb736f93f809afd08b18b6765.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Laravel框架中队列和工作(Queues、Jobs)操作实例详解.doc

本文 PDF 下载地址:Laravel框架中队列和工作(Queues、Jobs)操作实例详解.pdf

下一篇:返回列表
标签:队列   我们可以   操作   用户
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图