laravel5.5任务调度
laravel中使用调度程序时,只需要在服务器上增加一条 Cron 项目即可,不必在服务器上为每个任务生成单独的 Cron 项目
1. 定义调度
目标文件 app\Console\Kernel.php
1.1 使用Closure
<?php
namespace App\Console;
use DB;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected $commands = [
\App\Console\Commands\Inspire::class,
];
protected function schedule(Schedule $schedule)
{
//使用闭包方式
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
}
}
1.2 Artisan 命令调度
你可以给 command 方法传递命令名称或者类名称来调度一个 Artisan 命令:
$schedule->command('emails:send --force')->daily();
$schedule->command(EmailsCommand::class, ['--force'])->daily();
1.3 队列任务调度
job 方法可以用来调度 队列任务
$schedule->job(new Heartbeat)->everyFiveMinutes();
1.4 Shell 命令调度
exec 方法可用于向操作系统发出命令:
$schedule->exec('node /home/forge/script.js')->daily();
1.5 调度频率设置
->cron('* * * * * *'); # 在自定义的 Cron 时间表上执行该任务
->everyMinute(); # 每分钟执行一次任务
->everyFiveMinutes(); # 每五分钟执行一次任务
->everyTenMinutes(); # 每十分钟执行一次任务
->everyFifteenMinutes(); # 每十五分钟执行一次任务
->everyThirtyMinutes(); # 每半小时执行一次任务
->hourly(); # 每小时执行一次任务
->hourlyAt(17); # 每小时的第 17 分钟执行一次任务
->daily(); # 每天午夜执行一次任务
->dailyAt('13:00'); # 每天的 13:00 执行一次任务
->twiceDaily(1, 13); # 每天的 1:00 和 13:00 分别执行一次任务
->weekly(); # 每周执行一次任务
->monthly(); # 每月执行一次任务
->monthlyOn(4, '15:00'); # 在每个月的第四天的 15:00 执行一次任务
->quarterly(); # 每季度执行一次任务
->yearly(); # 每年执行一次任务
->timezone('America/New_York'); # 设置时区
这些方法可以合并其它限制条件以生成更精确的调度。例如,计划每周周一的调度:
// 每周一的下午一点钟运行
$schedule->call(function () {
//
})->weekly()->mondays()->at('13:00');
// 周一至周五上午 8 点至下午 5 点每小时运行一次...
$schedule->command('foo')
->weekdays()
->hourly()
->timezone('America/Chicago')
->between('8:00', '17:00');
以下是额外限制条件的列表:
->weekdays(); # 将任务限制在工作日
->sundays(); # 将任务限制在星期天
->mondays(); # 将任务限制在星期一
->tuesdays(); # 将任务限制在星期二
->wednesdays(); # 将任务限制在星期三
->thursdays(); # 将任务限制在星期四
->fridays(); # 将任务限制在星期五
->saturdays(); # 将任务限制在星期六
->between($start, $end); # 限制任务运行在开始到结束时间范围内
->when(Closure); # 根据闭包函数的返回来限制任务
1.6 闭包测试限制
when 方法可以用来根据给定的测试的结果来限制任务的执行。换句话说,如果给定的 Closure 返回 true,那么只要没有其他约束条件阻止任务运行,任务就会执行:
$schedule->command('emails:send')->daily()->when(function () {
return true;
});
skip 方法可以被看作是 when 的逆过程。如果 skip 方法返回 true 的话,那么任务将不会运行:
$schedule->command('emails:send')->daily()->skip(function () {
return true;
});
当链式调用多个 when 方法时,调度命令只有在所有的 when 条件返回 true 时才运行。
1.7 避免任务重复
默认情况,即便有相同的任务还在运行,调度内的任务依旧会被执行。为了避免这个问题,你可以使用 withoutOverlapping 方法:
$schedule->command('emails:send')->withoutOverlapping();
在上面这个例子中,如果没有其它 Artisan 命令 emails:send 在运行的话,此任务将于每分钟被运行一次。如果你的任务在执行时间上有很大的不同,你无法准确预测给定任务需要多长时间,withoutOverlapping 方法将会特别有帮助。
1.8维护模式
当 Laravel 处于 维护模式 时,Laravel 的调度功能将不会生效。
如果你想强制某个任务在维护模式下运行的话,你可以使用 evenInMaintenanceMode 方法:
$schedule->command('emails:send')->evenInMaintenanceMode();
2. 任务输出
Laravel 调度器提供了几个方便的方法来处理调度任务生成的输出。首先,使用 sendOutputTo 方法可以将输出发送到单个文件上以便后续检查:
$schedule->command('emails:send')
->daily()
->sendOutputTo($filePath);
如果想将输出附加到指定的文件上,则可以使用 appendOutputTo 方法:
$schedule->command('emails:send')
->daily()
->appendOutputTo($filePath);
使用 emailOutputTo 方法,你可以通过电子邮件将输出发送到你所指定的邮箱上。在发送任务的输出之前,你应该先配置 Laravel 的 电子邮件服务:
$schedule->command('foo')
->daily()
->sendOutputTo($filePath)
->emailOutputTo('foo@example.com');
{note} emailOutputTo、sendOutputTo 和 appendOutputTo 方法是 command 方法才有的,不支持在 call 方法上使用。
3. 任务钩子
通过 before 与 after 方法,你可以指定要在调度任务完成之前和之后执行的代码:
$schedule->command('emails:send')
->daily()
->before(function () {
// 任务就要开始了…
})
->after(function () {
// 任务完成…
});
任务钩子
通过 before 与 after 方法,你可以指定要在调度任务完成之前和之后执行的代码:
$schedule->command('emails:send')
->daily()
->before(function () {
// 任务就要开始了…
})
->after(function () {
// 任务完成…
});
4. 将以下 Cron 项目添加到服务器
使用调度器时,只需将以下 Cron 项目添加到服务器。
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
上面这个 Cron 会每分钟调用一次 Laravel 命令调度器,我们要做的就是将上面的项目添加到服务器运行,这里我们介绍使用crond
4.1 crond简介
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
分为系统任务调度和用户任务调度
- 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。配置文件位于/etc/crontab
- 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
4.2 crond使用
service crond start # 启动:
service crond stop # 停止
service crond status # 查看装填
service crond restart # 重启
service crond reload # 重新载入配置
crond命令格式
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。
4.3 crontab文件含义
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
其中:
- minute: 表示分钟,可以是从0到59之间的任何整数。
- hour:表示小时,可以是从0到23之间的任何整数。
- day:表示日期,可以是从1到31之间的任何整数。
- month:表示月份,可以是从1到12之间的任何整数。
- week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
- command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
4.4 项目实际操作
编辑当前用户的任务调度
crontab -e
然后将下面内容写入
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
查看是否写入成功
crontab -l
重启
service crond restart
laravel5.5任务调度的更多相关文章
- laravel5.5 任务调度 (转载)
Ubuntu和Mac环境中,我们可以使用crontab来控制计划任务 1. 定义调度 我们需要在 App\Console\Kernel 类的 schedule 方法中定义所有任务调度.例如: 上图中定 ...
- laravel5.5的任务调度(定时任务)详解(demo)
https://blog.csdn.net/LJFPHP/article/details/80417552 laravel5.5的定时任务详解(demo) 这篇文章写得挺详细的.看了它我基本就会用了 ...
- laravel5.2总结--任务调度
你可以通过 command() 来调用 artisan 命令, call 来调用方法或函数, 或者 terminal() 来执行单行命令脚本: 1.在app/Console/Commands文件夹 ...
- Laravel5.5 综合使用
使用 Laravel5.5 开发一个自动交割的项目,把使用到的开源扩展包及特性整理起来,以供后续使用. 一.安装IDE提示工具 Laravel IDE Helper 是一个极其好用的代码提示及补全工具 ...
- Docker容器里配置计划任务 crontab(DaoCloud+Docker +Laravel5)
最近项目涉及到一个定时任务的功能,所以去这几天研究了一下 crontab 的使用方法,按照网上的相关教程顺利在自己的电脑上成功开启了这个功能 Laravel + crontab 添加 crontab ...
- .net 分布式架构之任务调度平台
开源地址:http://git.oschina.net/chejiangyi/Dyd.BaseService.TaskManager .net 任务调度平台 用于.net dll,exe的任务的挂载, ...
- 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...
- Spring Quartz实现任务调度
任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...
- Quartz实现任务调度
一.任务调度概述 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作,任务调度涉及多线程并发. ...
随机推荐
- 特殊矩阵的压缩存储(转自chunlanse2014)
对称矩阵 对于一个矩阵结构显然用一个二维数组来表示是非常恰当的,但在有些情况下,比如常见的一些特殊矩阵,如三角矩阵.对称矩阵.带状矩阵.稀疏矩阵等,从节约存储空间的角度考虑,这种存储是不太合适的.下面 ...
- RPC电源监控总结
首先说一下监控机箱的监控原理. 设备的信息传输是通过tcp或者udp传输十六进制的数然后进行解析,传输数据. 如图: 设备反馈信息也是返回来的十六机制,然后按照对应的位置进将数据解析成二进制,用二进制 ...
- centos 7 iptables基本配置
安装iptable iptable-service #先检查是否安装了iptables service iptables status #安装iptables yum install -y iptab ...
- 常用mysql系统参数参考
http://aaronsa.blog.51cto.com/5157083/1741481
- selenium使用谷歌浏览器自带手机模拟器运行H5网页
背景:最开始用手机模拟H5页面跑自动化,发现经常因为app连接或者网络原因等一系列情况,导致M版(H5页面)用例跑不通,想通过浏览器自带的手机模拟器运行,保证稳定性 浏览器自带的模拟器如下图: 代码实 ...
- 数长方形有多少个?POJ(1693)
题目链接:http://poj.org/problem?id=1693 解题报告: 随机选两根横的,再找一下与这两根横线相交的竖线有多少根,m,那么就有(m-1)*m/2个长方形. #include ...
- Linux(二) - Unix&Linux 基本概念
主机 = 内核 + 实用工具 内核(kernel) 当计算机启动时,计算机要经历一系列动作,这些动作构成了引导过程.引导过程的最后一个动作是启动一个非常复杂的程序,该程序就被称为内核(Kernel) ...
- Miller rabin
蛤蛤,终于基本上搞懂了 #include<iostream> #include<cstdio> using namespace std; long long num[10]={ ...
- 流形(Manifold)初步
原文链接 欧几里得几何学(Euclidean Geometry) 两千三百年前,古希腊数学家欧几里得著成了<几何原本>,构建了被后世称为“欧几里得几何学”的研究图形的方法.欧几里得创立了当 ...
- 清除ie10+浏览器的input输入框后面会出现的x号和闭眼logo
x号:::-ms-clear{display:none;} 闭眼logo: ::-ms-reveal{display:none;} tips:如果在外部引用的css里面没有作用,可以在写本页面的< ...