Linux Crontab 定时任务&Laravel定时任务实战

Linux Crontab 定时任务

Cron介绍

我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表。我们可以使用crontab来定时做一些事情,比如每天凌晨2点进行的定期备份。

我们可以在以下文件夹内找到相关配置文件。

  • /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
  • /etc/crontab 这个文件负责调度各种管理和维护任务。
  • /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
  • 我们还可以把脚本放在 /etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthly 目录中,让它每小时/天/星期、月执行一次。

Crontab使用

我们常用的命令如下:

crontab [-u username]    //省略用户表表示操作当前用户的crontab
    -e      (编辑工作表)
    -l      (列出工作表里的命令)
    -r      (删除工作作)

我们用 crontab -e 进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。

我们用 crontab -l 列出当前用户的工作表所有命令

我们用 crontab -r 会从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件,慎重操作

crontab的命令构成为 时间+动作,时间即cron表达式,动作即操作命令或脚本。例如:每1分钟执行一次myCommand

* * * * * myCommand

Cron表达式

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种

语法格式:

Minutes Hours DayofMonth Month DayofWeek

当然这里讲的只是 Crontab 而不是其他的,比如 Quartz Cron 等。

例如要表示每隔 1 分钟执行一次,则cron写法如下:

* * * * * command

下面我们来解释各个域代表的值以及允许的值:

允许的数值 允许的特殊字符 备注
分Minutes 0-59 - * /
小时Hours 0-23 - * /
日期DayofMonth 1-31 - * / L W C
月份Month 1-12 JAN-DEC - * /
星期DayofWeek 1-7 SUN-SAT - * / 1 表示星期天,2 表示星期一,依次类推

允许的值解释:

Minutes(分): 可以用数字0-59 表示。

Hours(时): 可以用数字0 - 23表示。

Day-of-Month(天) : 可以用数字1 - 31 中的任一一个值,但要注意一些特别的月份。

Month(月): 可以用0 - 11 或用字符串 JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC”表示。

Day-of-Week(每周): 可以用数字1 - 7表示(1 = 星期日)或用字符口串SUN, MON, TUE, WED, THU, FRI and SAT表示。


符号解释:

* 表示所有值,代表整个时间段。

- 表示一个指定的范围,例如 2-6 表示 2,3,4,5,6

, 表示附加一个可能值,例如:1,2,5,7,8,9。

/ 符号前表示开始时间,符号后表示每次递增的值; 可以用正斜线指定时间的间隔频率,例如 0-23/2 表示每两小时执行一次。同时正斜线可以和星号一起使用,例如 */10,如果用在minute 字段,表示每十分钟执行一次。


示例:

 */5 * * * * 每隔5分钟执行一次
 0 */1 * * * 每隔1小时执行一次
 0 5-15 * * * 每天5-15点整点触发
 0/3 * * * * 每三分钟触发一次
 0-5 14 * * * 在每天下午2点到下午2:05期间的每1分钟触发 
 0/5 14 * * * 在每天下午2点到下午2:55期间的每5分钟触发
 0/5 14,18 * * * 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
 0/30 9-17 * * * 朝九晚五工作时间内每半小时
 0 10,14,16 * * * 每天上午10点,下午2点,4点 
 15,30,45 * * * *   每15分钟,30分钟,45分钟时触发任务
 0/3 * * * *  每小时的第0分0秒开始,每三分钟触发一次

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。 时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。 这个命令非常设合周期性的日志分析或数据备份等工作。


Laravel实战定时任务

创建命令

php artisan make:command Test

make:command 命令会在 app/Console/Commands 目录中创建一个新的命令类。如果command目录不存在,它会在你第一次运行 make:command 命令时自动创建。生成的命令将包含所有命令中默认存在的属性和方法。



namespace App\Console\Commands;

use Illuminate\Console\Command;

class Test extends Command
{
	// 此处省略部分默认生成代码...

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        \Log::info("Test");
        return 0;
    }
}

定义调度任务

你可以在 App\Console\Kernel 类的 schedule 方法中定义所有调度任务。让我们从一个调度任务的例子开始,在这个例子中,我们会调用 Test 命令类执行,每隔1分钟打印出 Test 日志。



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.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
         $schedule->command('command:test')->cron('*/1 * * * *');
//         $schedule->command('command:test')->everyMinute();
    }

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

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

启动 Schedule

在定义完以上的任务之后,可以通过 php artisan schedule:run 来执行这些任务,但是,这个任务执行起来后,需要不断的执行这个这个命令定时器才能不断的运行,所以就需要 linux 的系统功能的帮助,在命令行下执行下面的命令:

crontab -e
  • 执行完以上的命令之后,会出现一个处于编辑状态的文件,在文件中填入以下内容:
* * * * * php /path/to/artisan schedule:run
  • 如果服务器上有多个PHP或者需要指定某个PHP版本执行,可以在文件中填入以下内容:
* * * * * root /path/to/php /path/to/artisan schedule:run

上面一行中的 /path/to/php/path/to/artisan 需要改为实际的路径。

将Laravel项目部署至Linux服务器上,使用 crontab -l ,可以看到刚才编写过的命令

[wwwroot@xxx root]$ crontab -l
* * * * * /usr/local/php7/bin/php /wwwroot/cms/artisan schedule:run

上面命令的含义是每隔一分中就执行一下 schedule:run 命令。这样一来,前面定义的任务就可以不断的按照定义的时间间隔不断的执行,定时任务的功能也就实现了。


参考博客:https://learnku.com/laravel/t/1402/laravel-timing-task

https://lvwenhan.com/laravel-advanced/481.html

你可能感兴趣的:(PHP,linux,Linux,crontab,cron表达式,Laravel,定时)