php artisan 计划任务,Laravel 计划定时任务

Laravel 的命令调度器简化了任务调度,只需一个Cron条目即可管理所有任务。在`app/Console/Kernel.php`的`schedule`方法中定义任务,如每日清理数据库。调度选项包括按分钟、小时、日等频率执行,还可添加约束条件。任务输出可保存到文件或通过电子邮件发送,还能在任务开始和结束时触发回调函数或ping URL。
摘要由CSDN通过智能技术生成

1、简介

在以前,开发者需要为每一个需要调度的任务编写一个Cron条目,这是很让人头疼的事。你的任务调度不在源码控制中,你必须使用SSH登录到服务器然后添加这些Cron条目。Laravel命令调度器允许你平滑而又富有表现力地在Laravel中定义命令调度,并且服务器上只需要一个Cron条目即可。

任务调度定义在app/Console/Kernel.php文件的schedule方法中,该方法中已经包含了一个示例。你可以自由地添加你需要的调度任务到Schedule对象。

1.1 开启调度

下面是你唯一需要添加到服务器的Cron条目:* * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1

该Cron将会每分钟调用Laravel命令调度,然后,Laravel评估你的调度任务并运行到期的任务。

2、定义调度

你可以在App\Console\Kernel类的schedule方法中定义所有调度任务。开始之前,让我们看一个调度任务的例子,在这个例子中,我们将会在每天午夜调度一个被调用的闭包。在这个闭包中我们将会执行一个数据库查询来清空表:<?php

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();

}

}

除了调度闭包调用外,还可以调度Artisan命令和操作系统命令。例如,可以使用command方法来调度一个Artisan命令:$schedule->command('emails:send --force')->daily();

exec命令可用于发送命令到操作系统:$schedule->exec('node /home/forge/script.js')->daily();

2.1 调度常用选项

当然,你可以分配多种调度到任务:方法描述->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 基于测试的约束条件

when方法用于限制任务在通过给定测试之后运行。换句话说,如果给定闭包返回true,只要没有其它约束条件阻止任务运行,该任务就会执行:$schedule->command('emails:send')->daily()->when(function () {

return true;

});

2.2 避免任务重叠

默认情况下,即使前一个任务仍然在运行调度任务也会运行,要避免这样的情况,可使用withoutOverlapping方法:$schedule->command('emails:send')->withoutOverlapping();

在本例中,Artisan命令emails:send每分钟都会运行,如果该命令没有在运行的话。如果你的任务在执行时经常大幅度的变化,那么withoutOverlapping方法就非常有用,你不必再去预测给定任务到底要消耗多长时间。

3、任务输出

Laravel调度器为处理调度任务输出提供了多个方便的方法。首先,使用sendOutputTo方法,你可以发送输出到文件以便稍后检查:$schedule->command('emails:send')

->daily()

->sendOutputTo($filePath);

使用emailOutputTo方法,你可以将输出发送到电子邮件,注意输出必须首先通过sendOutputTo方法发送到文件。还有,使用电子邮件发送任务输出之前,应该配置Laravel的电子邮件服务:$schedule->command('foo')

->daily()

->sendOutputTo($filePath)

->emailOutputTo('foo@example.com');注意:emailOutputTo和sendOutputTo方法只对command方法有效,不支持call方法。

4、任务钩子

使用before和after方法,你可以指定在调度任务完成之前和之后要执行的代码:$schedule->command('emails:send')

->daily()

->before(function () {

// Task is about to start...

})

->after(function () {

// Task is complete...

});

4.1 ping URL

使用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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值