TAY
笔记 · · 阅读 145

laravel 计划任务

启动调度器

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

宝塔

su -c "cd /www/wwwroot/v2.com && php artisan schedule:run >> /dev/null 2>&1" -s /bin/sh www

创建脚本文件

php artisan make:command Classname --command=yjq:test
# app/Console/Commands/Classname

class Classname extends Command
{
    protected $signature = 'yjq:test  {param_name} {--option_name=}';

    protected $description = 'Command description';

    public function __construct()
    {
            parent::__construct();
    }

    public function handle()
    {
            //这里做任务的具体处理,可以用模型
            Log::info('任务调度二'.date('Y-m-d H:i:s',time()));
    }
}

注册脚本

# App\Console\Kernel

class Kernel extends ConsoleKernel
{
    protected $commands = [
        \App\Console\Commands\Classname::class
    ];
    
    //获取计划事件默认使用的时区。
    protected function scheduleTimezone()
    {
        return 'America/Chicago';
    }

    protected function schedule(Schedule $schedule)
    {
        //方法一:
        $schedule->call(function (){
           Log::info('任务调度一:闭包形式');
        })->everyMinute();
         //方法二
         $schedule->command('yjq:test')->everyMinute();
        $schedule->command('inspire')->everyMinute();
        
        $this->argument('param_name');
        $this->option('option_name');
        
        # 任务钩子
        $schedule->command('emails:send')
         ->daily()
         ->before(function () {
             // 任务即将开始...
         })
         ->after(function () {
             // 任务完成...
         });
         
         $schedule->command('emails:send')
         ->daily()
         ->onSuccess(function () {
             // 任务成功...
         })
         ->onFailure(function () {
             // 任务失败...
         });
        
    }

    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

# 方法一,方法二 用法
php artisan schedule:run >> null 2>&1
# 方法二 用法
php artisan yjq:test

# routes/console.php
Artisan::command('inspire', function () {
    \Illuminate\Support\Facades\Log::alert('-------sfdasdf-------');
})->describe('Display an inspiring quote');

Artisan::command('build {project}', function ($project) {
    \Illuminate\Support\Facades\Log::alert("Building {$project}!");
});


# 调用脚本时传递参数 必填参数:用{}指定
protected $signature = 'command:name {param_name}';
# 调用
$this->argument('param_name');

# 调用脚本时传递参数 选填参数:用{--}指定
protected $signature = 'command:name {--option_name=}' #option_name默认为空;
# 调用
$this->option('option_name');

定时任务

# ubuntu 查看php程序位置
which php
# windows 查看php程序位置
where php

crontab -e

crontab  -l

* * * * * /Applications/XAMPP/xamppfiles/bin/php  /Applications/XAMPP/xamppfiles/htdocs/blog/artisan schedul:run >> /dev/null 2>&1

crontab -r

队列任务调度

$schedule->job(new Heartbeat)->everyFiveMinutes();

// 分发任务到「heartbeats」队列...
$schedule->job(new Heartbeat, 'heartbeats')->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');设置时区
方法描述
->weekdays();限制任务在工作日执行
->weekends();限制任务在周末执行
->sundays();限制任务在周日执行
->mondays();限制任务在周一执行
->tuesdays();限制任务在周二执行
->wednesdays();限制任务在周三执行
->thursdays();限制任务在周四执行
->fridays();限制任务在周五执行
->saturdays();限制任务在周六执行
->between($start, $end);限制任务在 $start 和 $end 区间执行
->when(Closure);限制任务在闭包返回为真时执行
->environments($env);限制任务在特定环境中执行

环境限制

$schedule->command('emails:send')
            ->daily()
            ->environments(['staging', 'production']);

时区

$schedule->command('report:generate')
         ->timezone('America/New_York')
         ->at('02:00')

避免任务重复

$schedule->command('emails:send')->withoutOverlapping(10);

任务只运行在一台服务器上

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

后台任务

$schedule->command('analytics:report')
         ->daily()
         ->runInBackground();

维护模式

$schedule->command('emails:send')->evenInMaintenanceMode();

任务输出

$schedule->command('emails:send')
         ->daily()
         ->sendOutputTo($filePath);
         
         
$schedule->command('foo')
         ->daily()
         ->sendOutputTo($filePath)
         ->emailOutputTo('foo@example.com');

$schedule->command('foo')
         ->daily()
         ->emailOutputOnFailure('foo@example.com');

Pinging 网址

$schedule->command('emails:send')
         ->daily()
         ->pingBefore($url)
         ->thenPing($url);

$schedule->command('emails:send')
         ->daily()
         ->pingBeforeIf($condition, $url)
         ->thenPingIf($condition, $url);

$schedule->command('emails:send')
         ->daily()
         ->pingOnSuccess($successUrl)
         ->pingOnFailure($failureUrl);

目录