Queue

1. 队列驱动

  1. //数据库驱动,修改.env的QUEUE_DRIVER
  2. QUEUE_DRIVER=database

1. 数据库表

  1. php artisan queue:table
  2. php artisan queue:failed-table
  3. php artisan migrate

3.创建任务类

  1. <?php
  2. namespace App\Jobs;
  3. use Illuminate\Support\Facades\Log;
  4. class LogTestJob extends Job
  5. {
  6. /**
  7. * Create a new job instance.
  8. *
  9. * @return void
  10. */
  11. public function __construct()
  12. {
  13. //
  14. }
  15.  
  16. /**
  17. * Execute the job.
  18. *
  19. * @return void
  20. */
  21. public function handle()
  22. {
  23. sleep(5);
  24. for($i = 1; $i <= 10000; $i ++) {
  25. Log::info("--$i--");
  26. }
  27. }
  28. }

1. 分发任务

  1. <?php
  2. namespace App\Http\Controllers;
  3.  
  4. use App\Jobs\LogTestJob;
  5. use Illuminate\Support\Facades\Queue;
  6. use Laravel\Lumen\Routing\Controller as BaseController;
  7.  
  8. class TestController extends BaseController
  9. {
  10. /**
  11. * 测试队列任务分发
  12. * @description
  13. * @author csl
  14. */
  15. public function logTestJob(){
  16. $job = (new LogTestJob())->onQueue('log');// 任务将被委派到 "log" 队列
  17. dispatch($job);
  18. }
  19. }

1. 运行队列进程

  1. //监听queue为"log"的队列
  2. php artisan queue:work --queue=log
  3.  
  4. //监听queue为"default"的队列,--queue默认为default
  5. php artisan queue:work
  6.  
  7. //onQueue方法指定queue的名称
  8. $job = (new LogTestJob())->onQueue('log');

1. 任务过期

`config/queue.php`  配置文件里,每一个队列连接都定义了一个 ` retry_after ` 选项。这个选项指定了任务最多处理多少秒后就被当做失败重试了。比如说,如果这个选项设置为 ` 90 `,那么当这个任务持续执行了 ` 90 ` 秒而没有被删除,那么它将被释放回队列。通常情况下,你应该把 `retry_after` 设置为最长耗时的任务所对应的时间。

1. 任务超时

` queue:work ` Artisan 命令对外有一个 ` --timeout ` 选项,默认60秒。这个选项指定了 `Laravel` 队列处理器最多执行多长时间后就应该被关闭掉。有时候一个队列的子进程会因为很多原因僵死,比如一个外部的 HTTP 请求没有响应。这个 `--timeout` 选项会移除超出指定事件限制的僵死进程。

  1. <?php
  2. namespace App\Jobs;
  3. class ProcessPodcast implements ShouldQueue
  4. {
  5. /**
  6. * 任务运行的超时时间。
  7. *
  8. * @var int
  9. */
  10. public $timeout = 120;
  11. }
  12.  
  13. php artisan queue:work --timeout=120

` retry_after ` 配置选项和 ` --timeout`  命令行选项是不一样的,但是可以同时工作来保证任务不会丢失并且不会重复执行。

` --timeout ` 应该永远都要比 ` retry_after`  短至少几秒钟的时间。这样就能保证任务进程总能在失败重试前就被杀死了。如果你的 `--timeout` 选项大于 `retry_after` 配置选项,你的任务可能被执行两次。

1. 配置Supervisor

**安装Supervisor**

Supervisor 是 Linux 系统中常用的进程守护程序。如果队列进程 queue:work 意外关闭,它会自动重启启动队列进程。在 Ubuntu 安装Supervisor 非常简单:

  1. sudo apt-get install supervisor

**配置Supervisor**

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

  1. [program:BBB_log_queue]
  2. process_name=%(program_name)s_%(process_num)02d
  3. command=php /home/chaishuliang/www/BBB/artisan queue:work --queue=log --delay=5 --sleep=3 --tries=3
  4. autostart=true
  5. autorestart=true
  6. ;user=forge
  7. numprocs=5
  8. redirect_stderr=true
  9. stdout_logfile=/home/chaishuliang/www/supervisor/stdout_log/BBB_log_queue.log

**启动Supervisor**

当你成功创建配置文件后,你需要刷新 Supervisor 的配置信息并使用如下命令启动进程:

  1. sudo supervisorctl reread
  2. sudo supervisorctl update
  3. sudo supervisorctl start BBB_log_queue:* //Start all processes in a group,BBB_log_queue共5个进程(numprocs)
  4. sudo supervisorctl start all

1. 队列处理器 & 部署

因为队列处理器都是 long-lived 进程,如果代码改变而队列处理器没有重启,他们是不能应用新代码的。所以最简单的方式就是重新部署过程中要重启队列处理器。你可以很优雅地只输入 `queue:restart` 来重启所有队列处理器。

  1. php artisan queue:restart //修改代码后执行,队列才会读取新代码

laravel_Supervisor队列的更多相关文章

  1. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  2. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  3. Beanstalkd一个高性能分布式内存队列系统

    高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...

  4. .net 分布式架构之业务消息队列

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...

  5. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  6. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  7. Java消息队列--ActiveMq 实战

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  8. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  9. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

随机推荐

  1. c++问题集合

    1.对于程序未运行和运行后的代码段到底存储什么? 2.编写程序时为什么先申请变量后使用? 3.malloc本质到底分配了什么?谁赋给的? 4.程序在系统上是怎么运行起来的? 5.当我们双击一个程序运行 ...

  2. trie树的应用;

    链接:https://ac.nowcoder.com/acm/contest/920/B来源:牛客网 定义一张图的生成链是原图的一棵生成树,且这棵树退化成一条链.我们称一条生成链是原图的最小生成链,当 ...

  3. c++ 容器反转

    // reverse algorithm example #include <iostream> // std::cout #include <algorithm> // st ...

  4. go区分操作系统

    package main import ( "fmt" "runtime" ) func main() { fmt.Println("Go runs ...

  5. jQuery 的on()方法

    jQuery 的on()方法 一.总结 一句话总结: 1.普通添加事件:$("a").on("click", function () {执行的代码}) 2.未创 ...

  6. 淘宝rem适配方案

    /*px 转化换 rem ,转化是 10 .比如:你的设计图为750,那么就 750 / 75 = 10 rem.设计图中你量尺寸都要除 75 就是 rem值.再比如量的设计图按钮宽度 66px,那么 ...

  7. leetcode 96. Unique Binary Search Trees 、95. Unique Binary Search Trees II 、241. Different Ways to Add Parentheses

    96. Unique Binary Search Trees https://www.cnblogs.com/grandyang/p/4299608.html 3由dp[1]*dp[1].dp[0]* ...

  8. Qt编写安防视频监控系统2-视频播放

    一.前言 视频播放功能是核心功能之一,为了统一管理接口,统一封装成一个控件,对外提供seturl open close方法即可,不用去管内部的具体处理,这样就可以提供多种接口来实现统一的管理,比如vl ...

  9. Python操作memecache

    memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载,故常用来做数据库缓存.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 ...

  10. unity读取灰度图生成三维地形mesh

    准备灰度图 IGray.png及草地贴图 IGrass.jpg ,放入Assets下StreamingAssets文件夹中.     创建空材质,用作参数传入脚本.   脚本如下,挂载并传入材质球即可 ...