1.创建一个自定义的Command
php artisan make:command Test
2.编辑Test.php文件(app/Console/Commands/Test.php)
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
class Test extends Command
{
/**
* 名称
* 执行命令 : php artisan Test:command
* @var string
*/
protected $signature = 'Test:command';
//描述
protected $description = 'Command description';
public function __construct()
{
parent::__construct();
}
//执行的业务
public function handle()
{
//调用方法
$this->run_perform();
//或者直接书写逻辑
//Log::info(time().'测试定时任务');
}
private function run_perform()
{
//逻辑代码
}
}
3.修改App\Console\Kernel.php
namespace App\Console;
use App\Console\Commands\Hello;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
//应用中自定义的 Artisan 命令,可多个
protected $commands = [
];
//定义计划任务和执行事件
protected function schedule(Schedule $schedule)
{
//每分钟执行一次名称为command:ceshi的任务
$schedule->command('Test:command')->withoutOverlapping()->everyMinute();
或
$schedule->command(Test::class)->withoutOverlapping()->everyMinute();
// 工作日(周一至周五) 8 点 至 17 点每小时执行一次
//$schedule->command(Test ::class)
// ->weekdays()
// ->hourly()
// ->timezone('America/Chicago')
// ->between('8:00', '17:00');
}
protected function commands()
{
$this->load(__DIR__ . '/Commands');
require base_path('routes/console.php');
}
}
调用频率和限制
方法 | 描述 |
---|---|
->cron(‘* * * * *’); | 自定义 Cron 计划执行任务 |
->everyMinute(); | 每分钟执行一次任务 |
->everyFiveMinutes(); | 每五分钟执行一次任务 |
->everyTenMinutes(); | 每十分钟执行一次任务 |
->everyFifteenMinutes(); | 每十五分钟执行一次任务 |
->everyThirtyMinutes(); | 每三十分钟执行一次任务 |
->hourly(); | 每小时执行一次任务 |
->hourlyAt(17); | 每小时第 17 分钟执行一次任务 |
->daily(); | 每天 0 点执行一次任务 |
->dailyAt(‘13:00’); | 每天 13 点执行一次任务 |
->twiceDaily(1, 13); | 每天 1 点及 13 点各执行一次任务 |
->weekly(); | 每周日 0 点执行一次任务 |
->weeklyOn(1, ‘8:00’); | 每周一的 8 点执行一次任务 |
->monthly(); | 每月第一天 0 点执行一次任务 |
->monthlyOn(4, ‘15:00’); | 每月 4 号的 15 点 执行一次任务 |
->quarterly(); | 每季度第一天 0 点执行一次任务 |
->yearly(); | 每年第一天 0 点执行一次任务 |
->timezone(‘America/New_York’) | 设置时区 |
->weekdays(); | 限制任务在工作日执行 |
->weekends(); | 限制任务在周末执行 |
->sundays(); | 限制任务在周日执行 |
->mondays(); | 限制任务在周一执行 |
->tuesdays(); | 限制任务在周二执行 |
->wednesdays(); | 限制任务在周三执行 |
->thursdays(); | 限制任务在周四执行 |
->fridays(); | 限制任务在周五执行 |
->saturdays(); | 限制任务在周六执行 |
->between($start, $end); | 限制任务在 $start 和 $end 区间执行->hourly()->between(‘7:00’, ‘22:00’); |
->when(Closure); | 限制任务在闭包返回为真时执行 |
->environments($env); | 限制任务在特定环境执行 |
->withoutOverlapping(); | 默认情况下,即使之前的任务实例还在执行,调度内的任务也会执行。为避免这种情况的发生 |
->runInBackground() | 默认情况下,计划同时运行的多个命令将会顺序执行。若你有长时间运行的命令,这可能导致后续命令的启动时间比预期的更晚。你可以使用 runInBackground 方法让命令在后台运行 |
->onOneServer() | 你的应用在多台服务器中运行,你可能需要限制某个计划任务仅在单台服务器上运行 |
其他的用法可以查看官方文档 | https://learnku.com/docs/laravel/7.x/scheduling/7492#introduction |
4.执行定时任务
手动执行某单个任务:
php artisan Test:command (名称)
服务器自动执行:
1.编辑定时任务:
crontab -e
2.php多版本可以将php改为版本的绝对路径,项目路径
* * * * * php /www/wwwroot/ceshi/artisan schedule:run >> /www/wwwroot/ceshi/test.txt 2>&1
或不打印日志
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
3.重启服务器
CentOS7方法重启服务
systemctl restart crond.service
CentOS6方法重启服务
service crond restart