server/app/Process/CrontabDispatcherProcess.php

42 lines
1.4 KiB
PHP

<?php
namespace App\Process;
use App\Model\Crontab as cModel;
use App\Utils\Log;
use Hyperf\Crontab\Crontab;
use Hyperf\Crontab\Process\CrontabDispatcherProcess as BaseDispatcher;
use Hyperf\Crontab\CrontabManager;
use Psr\Container\ContainerInterface;
class CrontabDispatcherProcess extends BaseDispatcher
{
public function __construct(ContainerInterface $container, CrontabManager $manager)
{
$this->registerDatabaseTasks($manager);
parent::__construct($container);
}
protected function registerDatabaseTasks(CrontabManager $manager): void
{
try {
// 获取所有启用的定时任务
$tasks = cModel::queryEnable();
foreach ($tasks as $task) {
$crontab = (new Crontab())
->setName($task->crontab_id)
->setMemo($task->crontab_name)
->setEnable((bool)$task->enable)
->setRule($task->rule)
->setSingleton((bool)$task->singleton)
->setOnOneServer(true)
->setOptions(['skip_log' => $task->skip_log, 'callback' => $task->callback])
->setCallback(explode('@', $task->callback));
$manager->register($crontab);
}
} catch (\Throwable $e) {
// 记录日志
Log::record('动态加载crontab任务失败: ' . $e->getMessage(), 'error');
}
}
}