触发

任务的触发,主要的实现是在IlluminateFoundationBusDispatchesJobs这个trait中实现的,其只包含两个方法

protected function dispatch($job){
return app(Dispatcher::class)->dispatch($job);
} protected function dispatchNow($job){
return app(Dispatcher::class)->dispatchNow($job);
}

这两个方法的区别就在于时间上,一个是推送到队列,另外一个是推送并立即执行,依据前面的traitQueueable可知,我们可以在对任务进行设置,例如

protected function hpJob(){
$job = (new HappybirdJob(5))->onConnection("other")
->onQueue("happybird")
->delay(5);
}

以上例子表示,我们使用other的连接在happybird队列中设置一个延迟时间为5sHappybirdJob任务

由于dispatch, dispatchNow都是使用的是容器中绑定的Dsipatch类,接下来看一下这个类
这个类位于IlluminateBusDispatcher

Dispatch

该类主要是用于队列任务的分发以及设置,其中可以看到

    public function dispatch($command)
{
if ($this->queueResolver && $this->commandShouldBeQueued($command)) {
return $this->dispatchToQueue($command);
} else {
return $this->dispatchNow($command);
}
}

当使用dispatch类触发任务时,将需要判断是否实现了ShouldQueue,这个就是之前在讨论异步队列和同步队列时两个不同的列所实现的差异

而对于立即执行的操作来说,则是通过管道来执行

    public function dispatchNow($command)
{
return $this->pipeline->send($command)
->through($this->pipes)
->then(function ($command) {
return $this->container->call([$command, 'handle']);
});
}

对于管道的说明和解释,可以参考
Laravel Pipeline 组件的实现,
Understanding Laravel Pipelines这两篇文章

执行

对于推送到队列里面的任务,可以通过artisan命令及其参数来进行控制,通过如下命令查看详情

$ php artisan list | grep queue

将可以得到如下的结果:

  queue:failed        List all of the failed queue jobs
queue:failed-table Create a migration for the failed queue jobs database table
queue:flush Flush all of the failed queue jobs
queue:forget Delete a failed queue job
queue:listen Listen to a given queue
queue:restart Restart queue worker daemons after their current job
queue:retry Retry a failed queue job
queue:table 大专栏  Laravel 队列使用 Create a migration for the queue jobs database table
queue:work Process the next job on a queue

这里需要特别注意的是,queue:work, queue:listen这两个命令,其余的都没有额外的参数

queue:listern
--queue[=QUEUE]      The queue to listen on
--delay[=DELAY] Amount of time to delay failed jobs [default: 0]
--memory[=MEMORY] The memory limit in megabytes [default: 128]
--timeout[=TIMEOUT] Seconds a job may run before timing out [default: 60]
--sleep[=SLEEP] Seconds to wait before checking queue for jobs [default: 3]
--tries[=TRIES] Number of times to attempt a job before logging it failed [default: 0]
queue:work
--queue[=QUEUE]    The queue to listen on
--daemon Run the worker in daemon mode
--delay[=DELAY] Amount of time to delay failed jobs [default: 0]
--force Force the worker to run even in maintenance mode
--memory[=MEMORY] The memory limit in megabytes [default: 128]
--sleep[=SLEEP] Number of seconds to sleep when no job is available [default: 3]
--tries[=TRIES] Number of times to attempt a job before logging it failed [default: 0]

相同:

  • queue: 当包含多个队列时,指定其执行的优先级,优先级顺序为:越往前优先级越高
  • delay: 失败队列的延迟执行时间
  • memory: 任务执行的最大使用内存,默认为128M
  • tries: 任务失败后,尝试运行的次数,默认为不启动

差异:
对于listen来说,其包含一个--timeout参数,用来置顶执行的时间,超过该时间,将会造成任务失败,程序异常,队列停止

--sleep选项对于listen来说,表示暂时未有任务执行时,重新执行任务需要的时间,对于queue:work来说,则表示当没有任务运行时,重新检测任务的时间间隔

queue:work还有一项特别的参数就是用来指定work运行的模式,如果启用,则会强制队列服务器持续处理任务,无需重启框架

守护

官方推荐使用Supervisor来守护队列的进程,其推荐的配置如下:

[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
  • command:用来设置运行的命令,这个需要替换成自己的环境配置
  • numprocs: 监控的进程数量,需要注意的是,进程的数量不能设置过大

Please enable JavaScript to view the comments powered by Disqus.

Laravel 队列使用的更多相关文章

  1. Laravel 队列不执行的原因,job缓存

    laravel关于异步消息队列queue不生效(job缓存)解决办法 php artisan queue:restart 每次修改代码都需要执行上面的命令,执行后成功解决! 然后再次执行 php ar ...

  2. laravel 队列服务使用总结

    laravel 队列服务使用总结 使用步骤 配置队列驱动 //env文件,有的版本是QUEUE_DRIVER QUEUE_CONNECTION=database 迁移队列需要的数据表,在数据库中生成j ...

  3. laravel队列

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

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

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

  5. laravel 队列发送邮件

    批量处理任务的场景在我们开发中是经常使用的,比如邮件群发,消息通知,短信,秒杀等等,我们需要将这个耗时的操作放在队列中来处理,从而大幅度缩短Web请求和相应的时间.下面讲解下Laravel中队列的使用 ...

  6. laravel队列使用

    1.修改.env中queue_driver = databases 2.php artisan queue:table 在database 目录下migrations里面有对应的表 3.执行迁移文件 ...

  7. laravel队列,事件简单使用方法

    A.队列的使用 1.队列配置文件存储在 config/queue.php 根据自己的情况进行配置 2..env文件 QUEUE_DRIVER=database(根据个人情况配置,redis等) 3.创 ...

  8. PHP Laravel 队列技巧:Fail、Retry 或者 Delay

    当创建队列jobs.监听器或订阅服务器以推送到队列中时,您可能会开始认为,一旦分派,队列工作器决定如何处理您的逻辑就完全由您自己决定了. 嗯……并不是说你不能从作业内部与队列工作器交互,但是通常情况下 ...

  9. Laravel 队列的简单使用例子

    场景: 在一个a系统中注册一个用户时,发送请求到b系统中也注册一个相同信息的账号,考虑到网络有可能错误的原因,所以使用队列去处理 1.修改根目录 .env 文件的QUEUE_CONNECTION字段配 ...

随机推荐

  1. jq轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. bzoj2127happiness(最小割)

    一眼最小割. 一种比较好想的建图方式如下: 连源点表示学文,连汇点表示学理,然后adde(S,id(i,j),a[i][j]),adde(id(i,j),T,b[i][j]):对于相邻座位选择同一科的 ...

  3. redis day03 下

    事务 能够有回退状态 事务命令 安命令执行没问题,redis是弱事务型 nulti incr n1   -->QUEUED(返回仅队列了) EXEC -->返回结果 pipeline 流水 ...

  4. 蓝桥杯 Car的旅行路线 (预处理+最短路径)

    https://www.luogu.org/problem/P1027 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有4个飞机场,分别位于一个矩形的4个顶点上,同 ...

  5. SQL服务器攻击总结-注入

    查库选择convert(int,db_name())sysobjects 查当前表id,从sysobjects中选择id,xtype ='u'//此处要记录下数据库的id syscolumns查表对应 ...

  6. 600E - Lomsat gelral(找子树多颜色问题)(入门)

    题:https://codeforces.com/problemset/problem/600/E 题意:一棵树有n个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和 ...

  7. win10远程桌面身份验证错误,要求的函数不受支持

    出现原因win10最近安装了一个更新补丁导致的,当然可以直接卸载这个补丁,也可以安装操作来就可以.需要修改注册表里边的项目,添加下面的设置. 解决办法1.win+R 输入 regedit, 打开注册表 ...

  8. Work Scheduling(带反悔的贪心)

    https://www.luogu.org/problem/P2949 题目描述 Farmer John has so very many jobs to do! In order to run th ...

  9. 1)BS和CS区别

    (1)CS:  客户端服务器 BS: 浏览器和服务器 (2)二者区别: 微信就相当于  客户端服务器   同时 微信也有 网页版. BS灵活,不用下客户端,但是网页什么内容都有,就有可能将用户的信息泄 ...

  10. day08-内置函数和匿名函数

    1. 1)网络编程只能是二进制.2)照片和视频也是以二进制储存. 3)html网页爬取到的也是二进制编码. 2. 非常重要的4个内置函数:zip ,filter,map,sorted 1)zip: 例 ...