Task Scheduling in Yii 2

在工作中总是不可避免的会需要创建或者维护一些定时脚本,那么怎么去管理 Cron Jobs 呢?最常见的是使用 linux 系统的 corntab,需要添加/删除/修改某个定时任务直接去服务器上修改 crontab 配置文件。但是随着时间的推移,开发人员越来越多,需要维护的脚本越来越多,就会变得越来越艰难。

于是 Laravel 框架弄了一个 Task Scheduling 模块来管理定时任务,配置可以直接写在 PHP 代码里,然后上传到 git 来管理。今天我们要介绍的 yii2-schesuling 插件,就是从 Laravel 移植过来的。


下面我们开始介绍 yii2-schesuling 插件的安装 & 使用。

首先是安装 yii2-scheduling,建议直接使用 composer 来安装。

composer require omnilight/yii2-scheduling "*"

如果需要使用 pingBefore($url) or thenPing($url) 方法,还需要用 composer 安装 Guzzle HTTP library。

composer require guzzlehttp/guzzle

然后你需要创建自己的配置文件 @console/config/schedule.php,具体的语法可以看 yii2-scheduling 的文档,也可以直接参考 Laravel Task Scheduling 的文档。(推荐放在 @console/config 目录下面,当然你也可以放在项目的任何地方,只要你喜欢就好。)


/**
 * @var \omnilight\scheduling\Schedule $schedule
 */

// Place here all of your cron jobs

// This command will execute ls command every five minutes
$schedule->exec('ls')->everyFiveMinutes();

// This command will execute migration command of your application every hour
$schedule->command('migrate')->hourly();

// This command will call callback function every day at 10:00
$schedule->call(function(\yii\console\Application $app) {
    // Some code here...
})->dailyAt('10:00');

最后在 crontab 中添加定时任务。

* * * * * php /path/to/yii yii schedule/run --scheduleFile=@console/config/schedule.php 1>> /dev/null 2>&1

这里简单的解释一下整个的运行过程:在服务器上创建一个定时任务,每隔一分钟执行一次 php yii schedule/run 脚本。每次执行 schedule/run 脚本, 程序都会检查一遍已经添加到配置文件里面的定时脚本,看看哪些脚本已经到了计划的执行时间,然后去执行它。定时脚本配置文件的解析用的是 cron-expression,使用多个子进程来执行脚本用的是 symfony-process,如果对实现细节感兴趣,可以去看看这些项目的源代码。


参考:

https://laravel.com/docs/5.5/scheduling

https://github.com/omnilight/yii2-scheduling

https://github.com/mtdowling/cron-expression

https://symfony.com/doc/current/components/process.html

 898 total views,  1 views today

Leave a Reply

Your email address will not be published. Required fields are marked *