任务调度

任务调度:首先需要在Linux上面创建一条计划任务,该计划任务是每分钟调用laravel的命令

Linux上的命令 crontab -e

输入以下内容: * * * * * php /项目目录/artisan schedule:run >> /dev/null 2>&1

或者你想记录日志,日志没太大意义

* * * * * cd /www/php_demo_dev && /usr/local/bin/php artisan schedule:run >> /www/php_demo_dev/storage/logs/crontab-www-data.log

创建一个命令类

php artisan make:command Test

<?php

namespace App\Console\Commands;

use App\Models\Wx\WxUser;
use Illuminate\Console\Command;

class Test extends Command {
	/**
	 * 命令名称
	 *
	 * @var string
	 */
	protected $signature = 'test';
	
	/**
	 * 命令描述
	 *
	 * @var string
	 */
	protected $description = '测试的命令';
	
	/**
	 * Create a new command instance.
	 *
	 * @return void
	 */
	public function __construct() {
		parent::__construct();
	}
	
	/**
	 * Execute the console command.
	 *
	 * @return mixed
	 */
	public function handle() {
		for ($i = 0; $i < 10; $i++) {
			$data = [
				'openid'     => md5(microtime(true) . mt_rand(1, 9)),
				'unionid'    => md5(microtime(true) . mt_rand(1, 9)),
				'state'      => mt_rand(1, 8),
				'created_at' => date('Y-m-d H:i:s'),
				'updated_at' => date('Y-m-d H:i:s'),
			];
			$temp = WxUser::create($data);
			// 输出信息
			$this->info($temp->id);
		}
	}
}

指定运行的时间间隔(调度)

然后在 app\Console\Kernel.php 文件中指定调度

protected function schedule(Schedule $schedule) {
    $schedule->command('img_to_text')->everyMinute();//每分钟运行一次任务
    $schedule->command('send_kf_msg')->everyFiveMinutes();//每五分钟运行一次任务
}
方法 描述
->cron('* * * * *'); 在自定义 Cron 调度上运行任务
->everyMinute(); 每分钟运行一次任务
->everyFiveMinutes(); 每五分钟运行一次任务
->everyTenMinutes(); 每十分钟运行一次任务
->everyFifteenMinutes(); 每十五分钟运行一次任务
->everyThirtyMinutes(); 每三十分钟运行一次任务
->hourly(); 每小时运行一次任务
->hourlyAt(17); 每小时第十七分钟运行一次任务
->daily(); 每天凌晨零点运行任务
->dailyAt('13:00'); 每天 13:00 运行任务
->twiceDaily(1, 13); 每天 1:00 & 13:00 运行任务
->weekly(); 每周运行一次任务
->monthly(); 每月运行一次任务
->monthlyOn(4, '15:00'); 每月 4 号 15:00 运行一次任务
->quarterly(); 每个季度运行一次
->yearly(); 每年运行一次
->timezone('Asia/Shanghai'); 设置时区
->weekdays(); 只在工作日运行任务
->sundays(); 每个星期天运行任务
->mondays(); 每个星期一运行任务
->tuesdays(); 每个星期二运行任务
->wednesdays(); 每个星期三运行任务
->thursdays(); 每个星期四运行任务
->fridays(); 每个星期五运行任务
->saturdays(); 每个星期六运行任务
->between($start, $end); 基于特定时间段运行任务
->when(Closure); 基于特定测试运行任务

手动运行

php artisan test

避免任务重叠

  • 默认情况下,即使前一个任务仍然在运行调度任务也会运行,要避免这样的情况,可使用 withoutOverlapping 方法
  • 可以指定”without overlapping”锁失效前的分钟数,默认情况下,这个锁会在 24 小时后失效 $schedule->command('emails:send')->withoutOverlapping();

在单台服务器上运行

要告知任务只在单台服务器上运行,在定义调度任务时使用 onOneServer 方法即可。第一台获取到该任务的服务器会给任务上一把原子锁以阻止其 他服务器同时运行该任务:

$schedule->command('report:generate')
	->fridays()
	->at('17:00')
	->onOneServer();

任务输出

  • 使用 sendOutputTo 方法,你可以发送输出到文件以便稍后检查
  • 如果你想要追加输出到给定文件,可以使用 appendOutputTo 方法
$schedule->command('emails:send')
	->daily()
	->appendOutputTo($filePath);

任务钩子

使用 before 和 after 方法,你可以指定在调度任务完成之前和之后要执行的代码

$schedule->command('emails:send')
	->daily()
	->before(function () {
		// 任务即将开始...
	})
	->after(function () {
		// 任务已经完成...
	});