# 1、简介
>[info]在以前,开发者需要为每一个需要调度的任务编写一个Cron条目,这是很让人头疼的事。你的任务调度不在源码控制中,你必须使用SSH登录到服务器然后添加这些Cron条目。Laravel命令调度器允许你平滑而又富有表现力地在Laravel中定义命令调度,并且服务器上只需要一个Cron条目即可。
>[info]任务调度定义在app/Console/Kernel.php文件的schedule方法中,该方法中已经包含了一个示例。你可以自由地添加你需要的调度任务到Schedule对象。
## 1.1 开启调度
>[info]下面是你唯一需要添加到服务器的Cron条目:
~~~
* * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1
~~~
>[info]该Cron将会每分钟调用Laravel命令调度,然后,Laravel评估你的调度任务并运行到期的任务。
## 2、定义调度
>[info]你可以在App\Console\Kernel类的schedule方法中定义所有调度任务。开始之前,让我们看一个调度任务的例子,在这个例子中,我们将会在每天午夜调度一个被调用的闭包。在这个闭包中我们将会执行一个数据库查询来清空表:
~~~
namespace App\Console;
use DB;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel{
/**
* 应用提供的Artisan命令
*
* @var array
*/
protected $commands = [
'App\Console\Commands\Inspire',
];
/**
* 定义应用的命令调度
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
}
}
~~~
>[info]除了调度闭包调用外,还可以调度Artisan命令和操作系统命令。例如,可以使用command方法来调度一个Artisan命令:
~~~
$schedule->command('emails:send --force')->daily();
exec命令可用于发送命令到操作系统:
$schedule->exec('node /home/forge/script.js')->daily();
~~~
## 2.1 调度常用选项
>[info]当然,你可以分配多种调度到任务:
>[info]方法 描述
~~~
->cron('* * * * *'); 在自定义Cron调度上运行任务
->everyMinute(); 每分钟运行一次任务
->everyFiveMinutes(); 每五分钟运行一次任务
->everyTenMinutes(); 每十分钟运行一次任务
->everyThirtyMinutes(); 每三十分钟运行一次任务
->hourly(); 每小时运行一次任务
->daily(); 每天凌晨零点运行任务
->dailyAt('13:00'); 每天13:00运行任务
->twiceDaily(1, 13); 每天1:00 & 13:00运行任务
->weekly(); 每周运行一次任务
->monthly(); 每月运行一次任务
这些方法可以和额外的约束一起联合起来创建一周特定时间运行的更加细粒度的调度,例如,要每周一调度一个命令:
$schedule->call(function () {
// 每周星期一13:00运行一次...
})->weekly()->mondays()->at('13:00');
下面是额外的调度约束列表:
方法 描述
->weekdays(); 只在工作日运行任务
->sundays(); 每个星期天运行任务
->mondays(); 每个星期一运行任务
->tuesdays(); 每个星期二运行任务
->wednesdays(); 每个星期三运行任务
->thursdays(); 每个星期四运行任务
->fridays(); 每个星期五运行任务
->saturdays(); 每个星期六运行任务
->when(Closure); 基于特定测试运行任务
~~~
### 2.1.1 基于测试的约束条件
>[info]when方法用于限制任务在通过给定测试之后运行。换句话说,如果给定闭包返回true,只要没有其它约束条件阻止任务运行,该任务就会执行:
~~~
$schedule->command('emails:send')->daily()->when(function () {
return true;
});
~~~
## 2.2 避免任务重叠
>[info]默认情况下,即使前一个任务仍然在运行调度任务也会运行,要避免这样的情况,可使用withoutOverlapping方法:
~~~
$schedule->command('emails:send')->withoutOverlapping();
~~~
>[info]在本例中,Artisan命令emails:send每分钟都会运行,如果该命令没有在运行的话。如果你的任务在执行时经常大幅度的变化,那么withoutOverlapping方法就非常有用,你不必再去预测给定任务到底要消耗多长时间。
# 3、任务输出
>[info]Laravel调度器为处理调度任务输出提供了多个方便的方法。首先,使用sendOutputTo方法,你可以发送输出到文件以便稍后检查:
~~~
$schedule->command('emails:send')
->daily()
->sendOutputTo($filePath);
~~~
>[info]使用emailOutputTo方法,你可以将输出发送到电子邮件,注意输出必须首先通过sendOutputTo方法发送到文件。还有,使用电子邮件发送任务输出之前,应该配置Laravel的电子邮件服务:
~~~
$schedule->command('foo')
->daily()
->sendOutputTo($filePath)
->emailOutputTo('foo@example.com');
注意:emailOutputTo和sendOutputTo方法只对command方法有效,不支持call方法。
~~~
# 4、任务钩子
>[info]使用before和after方法,你可以指定在调度任务完成之前和之后要执行的代码:
~~~
$schedule->command('emails:send')
->daily()
->before(function () {
// Task is about to start...
})
->after(function () {
// Task is complete...
});
~~~
## 4.1 ping URL
>[info]使用pingBefore和thenPing方法,调度器可以在任务完成之前和之后自动ping给定的URL。该方法在通知外部服务时很有用,例如Laravel Envoyer,在调度任务开始或完成的时候:
~~~
$schedule->command('emails:send')
->daily()
->pingBefore($url)
->thenPing($url);
使用pingBefore($url)或thenPing($url)特性需要安装HTTP库Guzzle,可以在composer.json 文件中添加如下行来安装Guzzle到项目:
"guzzlehttp/guzzle": "~5.3|~6.0"
~~~
- 序言
- Web
- 基础
- (1)安装及配置
- (2)路由
- (3)中间件
- (4)控制器
- (5)请求
- (6)响应
- (7)视图
- (8)Blade模板引擎
- 数据库
- (1)起步
- (2)查询构建器
- (3)迁移
- (4)填充数据
- 模型和关联
- (1)起步
- (2)关联关系
- (3)集合
- (4)序列化
- 调试和日志
- API开发
- Artisan控制台
- Module模块
- (1)介绍
- (2)安装
- (3)使用
- 扩展
- (1)composer扩展
- (2)数据库字典安装
- 其他
- (1)Session
- (2)Redis
- (3)发送邮件
- (4)任务调度
- (5)文件上传
- 二次开发教程
- (1)项目结构简介
- (2)公共函数介绍
- (3)常用composer包
- (4)前台添加页面教程
- (5)后台添加页面教程
- (6)linux下项目的安装和升级
- (7)windows下安装和升级
- (8)数据库字典示例
- (9)前端模板教程
- 第三方账号申请
- 支付接口
- 微信支付
- 支付宝支付
- 第三方登录
- QQ登录
- 微信登录
- 新浪微博登录
- APP
- 项目简介
- API
- 雇佣
- 获取雇佣订单详情评价信息
- 获取雇佣订单作品详情信息
- 获取雇佣订单服务详情信息
- 获取雇佣订单另一方用户详情信息
- 雇主或威客维权
- 雇主或威客评论雇佣
- 雇主验收稿件
- 威客投稿
- 处理雇佣
- 获取雇佣订单详情信息
- 第三方支付雇佣赏金托管
- 余额支付雇佣赏金托管
- 创建雇佣信息
- 订单
- 我卖出的作品或服务雇佣的数量统计
- 我购买的作品或服务雇佣数量统计
- 雇主获取购买作品的评价信息
- 维权购买的作品
- 评价购买的作品
- 验收购买的作品
- 第三方支付购买作品
- 余额支付购买作品
- 购买作品
- 我卖出作品的订单详情
- 我购买作品的订单详情
- 我卖出的作品或服务的订单列表
- 我购买的作品或服务的订单列表
- 店铺
- 获取威客用户信息详情(没有店铺时)
- 用户任务评价列表(没有店铺时)
- 店铺评价列表
- 开启或关闭我的店铺
- 修改店铺背景图片
- 保存企业认证信息
- 威客店铺信息详情
- 我的店铺详情
- 保存店铺设置信息
- 获取店铺设置信息
- 获取店铺标签和可以选择的标签
- 获取雇佣服务信息
- 获取某个店铺下的全部服务信息
- 威客商城作品或服务列表或作品服务筛选列表
- 威客商城店铺列表或店铺筛选列表
- 热门分类信息
- 获取个人标签某个一级分类下的子分类信息
- 获取个人标签的一级分类信息
- 获取作品或服务的详情信息
- 查看作品或服务的评价信息
- 获取作品或服务的内容
- 获取某个店铺下的成功案例
- 获取某个店铺下的全部作品信息
- 获取威客店铺信息
- 查看是否可以进入雇佣页面
- 查看我发布的服务或我发布的服务筛选
- 查看我发布的作品或我发布的作品筛选
- 查看店铺被收藏状态
- 取消收藏店铺
- 收藏店铺
- 查询是否开启推荐服务增值工具
- 获取服务平台抽佣提成比例
- 查询是否开启推荐作品增值工具
- 获取作品平台抽佣提成比例
- 我收藏的店铺列表或对我收藏的店铺进行筛选
- 版本
- 获取im聊天appkey
- 获取App_ios当前的版本号
- 获取App安卓当前的版本号
- 财务
- 获取订单信息
- 赏金托管之余额支付(悬赏任务赏金托管,招标任务增值服务或赏金托管)
- 检测第三方支付配置信息
- 财务流水
- 提现
- 已认证的支付宝信息列表
- 已认证的银行卡信息列表
- 钱包余额
- 用户信息
- 技能标签(一级和二级)带选中状态
- 获取热门店铺信息
- 将系统消息和交易动态状态由未读变为已读
- 系统消息和交易动态未读消息数
- 关于我们
- 支付处理接口
- 获取用户充值信息
- 查询用户账户余额和每日提现金额
- 检验是否要跳转到修改支付密码页面
- 威客详情
- 帮助
- 意见反馈
- 获取威客的我的信息
- 获取雇主的我的信息
- 获取服务商列表信息
- 获取热门服务商信息
- 我是雇主首页的获取热门服务
- 获取首页顶部幻灯片信息
- 修改用户信息
- 修改个人案例信息
- 查询个人案例信息
- 添加个人案例信息
- 用户个人案例信息
- 添加、修改、取消个人标签
- 收藏任务
- 删除我收藏的某个任务
- 用户信息详情(雇主/威客)
- 我收藏的任务
- 任务
- 草稿箱任务删除
- 雇主未发布的任务编辑获取详情
- 稿件的维权详情
- 招标任务威客同意或拒绝付款方式
- 招标任务保存付款方式
- 招标任务查看付款方式
- 招标任务雇主托管赏金数据
- 任务详情评论列表
- 任务详情维权内容列表
- 任务详情交付稿件列表
- 威客承接任务统计
- 雇主发布的任务数量统计
- 创建任务获取任务增值服务列表
- 创建任务获取任务类型
- 威客查询交付稿件详情
- 雇主查询交付稿件详情
- 查看我同意协议信息
- 查看一级分类下的任务信息
- 我是威客首页热门任务
- 任务草稿箱
- 附件上传
- 获取省市区信息
- 任务大厅
- 威客的任务列表
- 查看评价信息
- 稿件回复
- 交易评论
- 交付稿件维权
- 交付稿件验收(成功或失败)
- 创建任务
- 稿件中标
- 稿件详情
- 创建交付稿件
- 创建稿件(投稿或报价)
- 稿件对应用户的好评率
- 根据任务id查询任务详情
- 雇主的任务列表
- 用户中心
- 登录
- 注册
- 注册手机验证码验证
- 退出登录
- 创建第三方登录信息
- 找回支付密码
- 修改支付密码
- 修改登录密码
- 找回登录密码
- 找回登录密码验证
- 发送手机验证码
- 认证
- 获取支付宝列表
- 获取银行卡列表
- 银行卡认证验证金额
- 验证支付宝认证金额
- 获取支付宝认证信息
- 支付宝认证
- 获取实名认证信息
- 获取认证的银行卡信息
- 获取银行认证可绑定的银行卡名称
- 银行卡认证
- 实名认证或企业认证接口
- Android
- Android打包用户须知
- 使用指南
- 基本配置
- 目录结构
- 第三方应用配置
- 自定义控件
- 下拉刷新,加载更多
- 图片上传
- 幻灯片控件
- 可分页的GridView
- Fragment懒加载
- 扫一扫
- 第三方jar包
- 常见问题
- iOS
- iOS打包用户须知
- 项目介绍
- 项目设计
- 目录结构
- 更改配置
- 常见问题
- App上架教程
- 苹果开发者账号如何申请?
- 第三方账号申请
- 微信
- 微博
- 支付宝
- ShareSDK
- OpenIM