CrontabManager.php 3.08 KB
<?php

namespace common\components\crontabs;

use Yii;
use common\services\queue\job\TemplateMessageJob;
use common\models\CrontabSetting;
use function fopen;
use function feof;
use function fgets;
use function trim;
use function print_r;
use function fclose;
use function explode;
use function in_array;
use function json_decode;
use function preg_replace;
use function json_encode;

/**
 * 系统定时任务管理器
 * Class CrontabManager
 * @package app\ht\modules\automation\CrontabManager
 */
class CrontabManager
{
    const ROUTE_AUTO            = 'crontab/auto';       // 秒级
    const ROUTE_DAILY           = 'crontab/daily';      // 每日凌晨0点
    const ROUTE_HOURLY          = 'crontab/hourly';     // 每小时
    const ROUTE_WEEKLY          = 'crontab/weekly';     // 每周日00:00
    const ROUTE_MONTHLY         = 'crontab/monthly';    // 秒级-定时任务
    const ROUTE_MINUTELY        = 'crontab/minutely';   // 秒级-定时任务
    const ROUTE_MONDAY          = 'crontab/monday';     // 秒级-定时任务
    const ROUTE_DAILY8          = 'crontab/daily8';     // 秒级-定时任务
    const ROUTE_DAILY12         = 'crontab/daily12';    // 每天中午12:00

    /**
     * 根据后台的crontab任务配置参数自动创建并加载后台crontab任务
     * 注意: 需要在HT后台的[自动化业务]/[后台任务管理]配置好参数
     */
    public static function loadCrontab()
    {
        $crontabs = Yii::$app->crontabs;

        // 清除所有定时任务
        $crontabs->clearJobs();

        // 加载系统常规定时任务
        $setting = CrontabSetting::findOne(1);
        $crontabRootPath = $setting->crontab_root_path;
        $autoJobNum = $setting->auto_job_num;

        // 秒级定时任务
        $crontabs->addJobByGroupName($crontabRootPath, '* * * * *', 'auto', self::ROUTE_AUTO, $autoJobNum);
        // 每日凌晨0点定时任务
        $crontabs->addJobByGroupName($crontabRootPath, '0 0 * * *', 'daily', self::ROUTE_DAILY, 1);
        // 每小时定时任务
        $crontabs->addJobByGroupName($crontabRootPath, '0 */1 * * *', 'hourly', self::ROUTE_HOURLY, 1);
        // 每周日00:00定时任务
        $crontabs->addJobByGroupName($crontabRootPath, '0 0 * * 0', 'weekly', self::ROUTE_WEEKLY, 1);
        // 每月1号00:00定时任务
        $crontabs->addJobByGroupName($crontabRootPath, '0 0 1 * *', 'monthly', self::ROUTE_MONTHLY, 1);
        // 每分钟定时任务
        $crontabs->addJobByGroupName($crontabRootPath, '*/1 * * * *', 'minutely', self::ROUTE_MINUTELY, 1);
        // 每周一00:00定时任务
        $crontabs->addJobByGroupName($crontabRootPath, '0 0 * * 1', 'monday', self::ROUTE_MONDAY, 1);
        // 每天早上08:00定时任务
        $crontabs->addJobByGroupName($crontabRootPath, '0 8 * * *', 'daily8', self::ROUTE_DAILY8, 1);
        // 每天中午12:00定时任务
        $crontabs->addJobByGroupName($crontabRootPath, '0 12 * * *', 'daily12', self::ROUTE_DAILY12, 1);

        /**
         * 加载模板消息的定时监听任务
         */
        TemplateMessageJob::loadCrontab($crontabRootPath);
    }
}