一.配置

队列配置文件存放在config/queue.php 。在该文件中你将会找到框架自带的每一个队列驱动的连接配置,包括数据库、Beanstalkd、 IronMQ、 Amazon SQS、 Redis 以及同步(本地使用)驱动。其中还包含了一个 null 队列驱动以拒绝队列任务。

默认是sync,即同步的,直接处理,无队列.要将其修改为对应的类型,如database等

二.依赖

1.数据库依赖
为了使用database 队列驱动,需要一张数据库表来存放任务,要生成创建该表的迁移,运行 Artisan 命令queue:table ,迁移被创建好了之后,使用migrate 命令运行迁移:

php artisan queue:table
php artisan migrate

  

2.其他队列类型依赖
下面是以上列出队列驱动需要安装的依赖:
• Amazon SQS: aws/aws-sdk-php ~3.0
• Beanstalkd: pda/pheanstalk ~3.0
• IronMQ: iron-io/iron_mq ~2.0
• Redis: predis/predis ~1.0

三.生成任务类

1.默认情况下,应用的所有队列任务都存放在app/Jobs 目录。你可以使用 Artisan CLI 生成新的队列任务:

php artisan make:job SendReminderEmail --queued

  

该命令将会在app/Jobs 目录下生成一个新的类,并且该类实现了Illuminate\Contracts\Queue\ShouldQueue接口,--queued告诉 Laravel 该任务应该被推送到队列而不是同步运行。

2.SendReminderEmail.php代码如下:

<?php

namespace App\Jobs;

use Illuminate\Support\Facades\Log;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Models\User; class SendReminderEmail extends Job implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels; protected $user;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
} /**
* 处理任务.
*
* @return void
*/
public function handle()
{
Log::alert('我是来自队列,发送了一个邮件',['id' => $this->user->id, 'name' => $this->user->name]);
}
}

  

3.任务发生异常
a.任务在处理的时候发生异常,任务将被放回队列.在下一次再被处理
b.判断同一任务失败的次数
$this->attempts() // 返回失败次数
$this->release(50); // 将任务放回到队列,50秒后次执行

四.推送任务

1.控制器中:

$user = Auth::user();
$this->dispatch((new SendReminderEmail($user))->delay(60)); //delay表示延迟队列执行 // 也可以将任务推送到不同的队列中
$this->dispatch((new SendReminderEmail($user))->onQueue('jobs')); // 也可以从请求中分发任务
$this->dispatchFrom('App\Jobs\ProcessOrder', $request, [附加的参数]);

  

2.其他地方使用 

use DispatchesJobs;
......
$this->dispatch()

  

五.启动队列监听

1.基本命令

php artisan queue:listen connection_name --queue=queue_name

php artisan queue:listen connection //指定连接,也就是不同队列类型,如database,redis,在queue.php中配置

php artisan queue:listen --queue=high,low //指定队列优先级,比如有限处理某队列,多个队列用,分割

php artisan queue:listen --timeout=60 //每个任务运行最大时间不超过60秒

php artisan queue:listen --sleep=5 //没有任务的时候休眠5秒

php artisan queue:listen --tries=3 //失败任务尝试3次

 

queue:work 默认只执行一次队列请求, 当请求执行完成后就终止;
queue:listen 监听队列请求,只要运行着,就能一直接受请求,除非手动终止;

 

2.作为系统进程运行

Supervisor

Supervisor 配置文件通常存放在/etc/supervisor/conf.d 目录,在该目录中,可以创建多个配置文件指示 Supervisor 如何监视进程,例如,让我们创建一个开启并监视queue:work 进程的laravel-worker.conf 文件:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --daemon
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

  

在本例中, numprocs 指令让 Supervisor 运行 8 个queue:work 进程并监视它们,如果失败的话自动重启。配置文件创建好了之后,可以使用如下命令更新 Supervisor 配置并开启进程:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

  

3.后台队列(守护进程)

Artisan 命令queue:work 包含一个--daemon 选项来强制队列 worker 持续处理任务而不必重新启动框架。相较于queue:listen 命令该命令对 CPU 的使用有明显降低:

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 任务来查看所有有效选项。

注意点:
1.后台队列 worker 在处理每个任务时不重启框架,因此,你要在任务完成之前释放资源,举个例子,如果你在使用 GD 库操作图片,那么就在完成时使用imagedestroy 释放内存。类似的,数据库连接应该在后台长时间运行完成后断开,你可以使用DB::reconnect 方法确保获取了一个新的连接。

2.如果修改了代码,在后台队列中是无效的,必须重启队列
php artisan queue:restart
这个命令依赖于缓存系统重启进度表,默认情况下,APC 在 CLI 任务中无法正常工作,如果你在使用 APC,需要在 APC 配置中添加apc.enable_cli=1 。

六.处理失败任务

1.创建一个 failed_jobs 表的迁移

php artisan queue:failed-table

  

2.生成表

php artisan migrate

  

3.加重试次数限制

php artisan queue:listen connection-name --tries=3

  

超过3次的任务将被移到failed_jobs表

4.也可以手动删除一个任务

if ($this->attempts() == 1) {
$this->delete();
}

  

5.添加失败任务事件

a.AppServiceProvider中添加

/**
* 启动应用服务
*
* @return void
*/
public function boot()
{
Queue::failing(function ($connection, $job, $data) {
// Notify team of failing job...
});
}

  

b.在任务类中添加

/**
* 执行任务
*
* @param Mailer $mailer
* @return void
*/
public function handle(Mailer $mailer)
{
//
} /**
* 处理失败任务
*
* @return void
*/
public function failed()
{
// Called when the job is failing...
}

  

6.重试失败任务

a.查看失败的任务
php artisan queue:failed b.重新执行失败任务
php artisan queue:retry 5 //重新执行id为5的失败任务 c.删除失败任务
php artisan queue:forget 5 //删除id为5的失败任务 d.删除所有任务
php artisan queue:flush

  

总体而言,任务和事件的相同之处都是需要触发/推送;不同之处可能在于,任务一般是耗时操作,放入队列较好;事件一般不是耗时操作,当然事件也可以是耗时操作,也能放入队列.

Laravel之队列的更多相关文章

  1. 使用Laravel的队列实现系统通知、

    使用Laravel的队列实现系统通知. 第一步:创建 jobs表的migrate php artisan queue:table 第二步:创建jobs 表 php artisan migrate 第三 ...

  2. Laravel Queues 队列应用实战

    队列,顾名思义,排着队等着做事情.在生活场景中,凡是排队的人,都是带有目的性的.要完成某件事情,才去排队的,要不没有谁会闲到排队玩儿.而在软件应用层面,队列是什么,队列有什么优点,我们什么时候需要用队 ...

  3. Laravel中队列的使用

    以laravel5.5为例子: 1.配置队列:composer require "predis/predis:~1.0" a.在ENV中配置:QUEUE_DRIVER=redis ...

  4. laravel queue队列使用

    一篇文章: laravel中的队列服务跟其他队列服务也没有什么不同,都是最符合人类思维的最简单最普遍的流程:有一个地方存放队列信息,一个PHP进程在运行时将任务写入,另外一个PHP守护进程轮询队列信息 ...

  5. Laravel异步队列全攻略

    最近项目需求,研究了laravel的异步队列.官方文档虽然很是详细,但也有些晦涩难懂,在此记录下步骤,供大家参考. 1.修改/config/queue.php文件 <?php return [ ...

  6. laravel job 队列

    1.数据库建表 php artisan queue:table<span> </span>//队列任务表 php artisan queue:failed-table<s ...

  7. Laravel消息队列怎么使用

    使用database驱动做队列 下面是简单使用教程 1. 修改.env文件配置 QUEUE_CONNECTION=sync改成QUEUE_CONNECTION=database 默认的sync是同步队 ...

  8. laravel队列-让守护进程处理耗时任务

    待解决的问题 最近在做一个服务器集群管理的web项目,需要处理一些极其耗时的操作,比如磁盘格式化分区.对于这个需求,最开始的想法是,为了让节点上的rpc(远程过程调用) service端尽可能简单(简 ...

  9. Laravel中的队列处理

    Laravel中的队列处理 队列介绍 为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念--消息传递,而消息队列就可以在它上面扩展一下,把它说的更 ...

随机推荐

  1. JAVA下几个问题

    一.Server MyEclipse Tomcat v8.5 was unable to start within 45 seconds. If the server requires more ti ...

  2. hdu 6114 百度之星复赛B T1

    Chess Problem Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子. 一天,小度在棋盘上摆起了许多車……他想知道,在一共N×M个点的矩形棋盘中 ...

  3. Java中Collections的frequency方法

    注:调用此方法时需要根据自己的须由复写Objects的equals方法 创建复写了equals方法的对象类 public class Student { private String name; pr ...

  4. 《Linux命令、编辑器与shell编程》第三版 学习笔记---003 使用multibootusb

    1.下载文件https://codeload.github.com/mbusb/multibootusb-8.9.0.tar.gz,使用命令: tar xvf multibootusb-8.9.0.t ...

  5. CppCMS1.0.3 Build by VS2012

    1.CppCMS简介 CppCMS是一个C++的Web开发框架(不是一个CMS).它不同于大多数其他Web开发框架,如巨蟒Django , Java的Servlets ,或C++ Wt因为它在设计和调 ...

  6. centos7 svn服务器搭建

    系统环境:centos 7.5 yum安装svn yum install subversion -y 创建svn 版本库目录 mkdir -p /var/svn/svnrepos 在版本库目录下创建版 ...

  7. inotify+rsync实现实时同步并邮件通知

    服务器之间文件实时同步,监控文件的变化,发送邮件通知,并实时同步文件. 由于人工同步多台服务器的文件比较吃力,可以借助这样一套软件,自动化的实现这样的工作. 并且可以事实监控变化发送邮件给系统管理人员 ...

  8. Laravel 添加自定义辅助函数

    1. 在 app 目录下新建一个文件 helpers.php 2. 在 composer.json 文件的 autoload 字典中添加 "files":["app/he ...

  9. Jquery学习之路(二) 实现table样式的设定

    上一篇jquery实现checkbox的全选,得到了一些朋友的建议,其中插件的定义我的确不太清楚,也闹了个笑话,有些朋友建议我去看<锋利的Jquery>,说实话正在看了.由于正在学习中,我 ...

  10. (3)新概念英语一(11-20)lessons

    12 13 14 15 16 17 18无单词 19 20