Laravel定时任务(任务调度)

Laravel定时任务(任务调度)

简介

任务调度|综合话题《Laravel 6 中文文档 6.x》|laravel china中文社区

过去,你可能需要在服务器上为每一个调度任务去创建 Cron 条目。因为这些任务的调度不是通过代码控制的,你要查看或新增任务调度都需要通 SSH 远程登录到服务器上去操作,所以这种方式很快会让人变得痛苦不堪。

Laravel 的命令行调度器允许你在 Laravel 中清晰明了地定义命令调度。在使用这个任务调度器时,你只需要在你的服务器上创建单个 Cron 入口。你的任务调度在 app/Console/Kernel.php 的 schedule 方法中进行定义。为了帮助你更好的入门,这个方法中有个简单的例子。

基本用法

配置 crontab 启动调度器 schedule

# 将运行调度器的命令,加入到cron服务中,每分钟调用一次调度器运行命令
# schedule:run 命令被执行时,Laravel将根据定义的内容执行预定的程序
* * * * *  /usr/sbin/php /data/www/artisan schedule:run >> /dev/null 2>&1 
  • crond服务配置方法

Linux定时任务(cron服务)

schedule详解

在 Laravel 中的 App\Console\Kernel 类中定义所有的调度任务

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     * 应用中自定义的artisan命令
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        /**
         * 调度方法: 闭包调用 | shell命令调用 | artisan命令调用 | 队列命令调用 | invokable object调用 
         * 
         * 闭包调用:$schedule->call(function () {...})
         * shell命令调用:$schedule->exec(...)
         * artisan命令调用:$schedule->command(...)
         * 队列命令调用:$schedule->job(...)
         * invokable object调用:$schedule->job(...)
         */
         
         /**
          * 调度频率设置
          *
          * ->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')  设置时区
          */
          
         // 以下所用例子,调度频率统一设置为每天0点调用
         
         /**
          * 闭包调用
          * 例:
          */ 
         $schedule->call(function () {
             echo "闭包调用测试"."\r\n";
         })->daily();   // 正常调度
         
         
         /**
          * invokable object调用
          * Invokable objects 指的是 PHP 中含有 __invoke 方法的类。
          * 例:
          */ 
          $schedule->call(new DeleteRecentUser)->daily();
          
          /**
           * shell命令调用
           * $schedule使用exec方法向系统发送命令
           * 例:
           */ 
          $schedule->exec('ps -aux | grep drc')->daily();
          
          /**
           * artisan命令调用
           * 可以通过command()方法传递命令名称或者类来调度一个artisan命令
           * 例:
           */
           $schedule->command('make:command syncAttackSyslog')->daily();
           $schedule->commamd(MakeCommand::class,'syncAttackSyslog')->daily();
          
          /**
           * 队列任务调度
           * job 方法可以用来调度 队列任务 。 此方法提供了一种快捷方式来调度任务,而无需使用 call 方法创建闭包来调度任务
           * 例:
           */
           $schedule->job(new Heartbeat)->everyFiveMinutes();
           $schedule->job(new Heartbeat, 'heartbeats')->everyFiveMinutes(); // 分发任务到「heartbeats」队列...
          
          /******************************************调度限制*********************************************************************/
           
          /**
          * 调度频率限制:
          * 
          * ->weekdays()            限制任务在工作日执行
          * ->weekends()            限制任务在周末执行
          * ->sundays()             限制任务在周日执行
          * ->mondays()             限制任务在周一执行
          * ->tuesdays()            限制任务在周二执行
          * ->wednesdays()          限制任务在周三执行
          * ->thursdays()           限制任务在周四执行
          * ->fridays()             限制任务在周五执行
          * ->saturdays()           限制任务在周六执行
          * ->between($start, $end) 限制任务在 $start 和 $end 区间执行
          * ->unlessBetween         不限制任务在一天中的某个时间段的执行
          * ->when(Closure)         限制任务在其闭包返回为真时执行
          * ->environments($env)    限制任务在特定环境中执行
          */
          
          // 特殊限制条件详解
          
          /**
           * ->when(Closure)
           * when 方法可根据给定的闭包函数的执行结果判断是否执行,返回 true ,若无其他限制条件阻止,任务就会一直执行:
           *
           * ->skip()为->when()的逆方法:当其闭包返回true时不执行调度任务
           *
           * 例:
           */
           $schedule->commamd('make:command test')->daily()->when(function () {
               return true;
           });
           
           /**
            * ->environments($env):environments方法可限制任务在给定环境中执行
            * 例:
            */
            $schedule->commamd('list')->daily()->enviroments(['staging', 'production']);
            
            /***************************************************************************************************************/
            
            /**
             * 调度任务避免任务重复: ->withoutOverlapping()
             * 例:
             */ 
            $schedule->command('make:command test')->withoutOverlapping();
            
            /**
             * 任务仅运行在同一台服务器上: ->onOneServer()
             */
            
            /***************************************后台任务************************************************************************/ 
            
            /**
             * 重点
             * 任务后台运行: ->runInBackground(),适用于单个任务执行时间长会延误后面的任务
             * 例:
             */
             $schedule->command('analytics:report')->daily()->runInBackground();
            
            /***************************************任务输出************************************************************************/
            
            /**
             * 任务执行结果输出:
             *          正常方式: ->sendOutputTo(string $filePath)
             *          附加方式: ->appendOutputTo(string $filePath)
             *          发送到指定邮箱: ->emailOutputTo('xxxx@qq.com')
             *          任务失败时发送结果到邮箱:->emailOutputOnFailure('foo@example.com');
             */
             
            /***************************************任务钩子************************************************************************/
             
            /**
             * 在调度任务前或调度任务后执行指定的闭包
             *     调度任务前: ->before(function () {...})
             *     调度任务后: ->after(function() {...})
             */
              
            /**
             * 任务成功或失败后执行相应的闭包
             *      成功: ->onSuccess(function () {...})
             *      失败: ->onFailure(function () {...})
             */
             
            /**
             * 在调度任务前或调度任务后ping指定的url, 对于需要通知外部服务任务执行情况有用。
             *     调度任务前: ->pingBefore(string $url)
             *     调度任务后: ->thenPing(string $url)
             * 给定条件为true时,才执行以上命令
             *     ->pingBeforeIf($condition,string $url)
             *     ->thenPingIf($condition,$string $url)
             */
             
            /**
             * 任务成功或失败后ping 指定的 url
             *      成功: ->pingOnSuccess($successUrl)
             *      失败: ->pingOnFailure($failureUrl)
             */
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值