Laravel 自定义命令及任务调度

2019-12-12  本文已影响0人  phpnet

自定义命令

<?php
namespace App\Console\Commands;

use Illuminate\Support\Facades\Redis;
use App\Services\SpreadsheetService;
use Illuminate\Console\Command;

class CreateTask extends Command
{

    private $spreadsheet;

    private $limit = 200000;

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'create:task {key?} {filename?} {worksheet?}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Create a scrapy queue task';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
        $this->spreadsheet = new SpreadsheetService($this->limit);
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $key = $this->argument('key') ?: 'queue:task';
        $worksheet = $this->argument('worksheet') ?: '';
        $filename = storage_path($this->argument('filename') ?: 'task.xlsx');
        if (! file_exists($filename)) {
            return $this->error('file not found: ' . $filename);
        }

        $total = 0;
        $array = [];
        $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
        switch ($extension) {
            case 'xlsx':
            case 'xls':
                $data = $this->spreadsheet->reader($filename, $worksheet, false);
                foreach ($data as $list) {
                }
                break;
            default:
                return $this->error('格式不支持');
        }
        return $this->info('finish!');
    }
}

任务调度

添加调度器

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

这个 Cron 会每分钟执行一次 Laravel 的命令行调度器。当 schedule:run 命令被执行的时候,Laravel 会根据你的调度执行预定的程序。

定义调度

// schedule
$schedule->call(function () {
    DB::table('recent_users')->delete();
})->daily();

// 除了使用闭包来定义任务调度外,你也可以使用 invokable objects。
// Invokable objects 指的是 PHP 中含有 __invoke 方法的类。
$schedule->call(new DeleteRecentUsers)->daily();

// Artisan 命令调度(推荐)
$schedule->command('emails:send Taylor --force')->daily();

// 队列任务调度
$schedule->job(new Heartbeat)->everyFiveMinutes();

// Shell 调度
$schedule->exec('node /home/forge/script.js')->daily();

调度频率设置

方法 描述
->cron('* * * * *'); 自定义 Cron 计划执行任务
->everyMinute(); 每分钟执行一次任务
->everyFiveMinutes(); 每五分钟执行一次任务
->everyTenMinutes(); 每十分钟执行一次任务
->everyFifteenMinutes(); 每十五分钟执行一次任务
->everyThirtyMinutes(); 每三十分钟执行一次任务
->hourly(); 每小时执行一次任务
->hourlyAt(17); 每小时第 17 分钟执行一次任务
->daily(); 每天午夜执行一次任务(译者注:每天零点)
->dailyAt('13:00'); 每天 13 点执行一次任务
->twiceDaily(1, 13); 每天 1 点及 13 点各执行一次任务
->weekly(); 每周执行一次任务
->weeklyOn(1, '8:00'); 每周一的 8 点执行一次任务
->monthly(); 每月执行一次任务
->monthlyOn(4, '15:00'); 每月 4 号的 15 点 执行一次任务
->quarterly(); 每季度执行一次任务
->yearly(); 每年执行一次任务
->timezone('America/New_York'); 设置时区

小技巧

  1. 避免任务重复
$schedule->command('emails:send')->withoutOverlapping();
  1. 任务只运行在一台服务器上
// 你的应用默认缓存驱动必须是 memcached 或 redis 才能使用这个特性。除此之外,所有服务器必须使用同一台中央缓存服务器来通信。
$schedule->command('report:generate')->fridays()->at('17:00')->onOneServer();
  1. 后台任务
// 针对有长时间运行的命令
$schedule->command('analytics:report')->daily()->runInBackground();
上一篇下一篇

猜你喜欢

热点阅读