Files
ulthon_admin/extend/base/common/controller/TimerControllerBase.php
augushong 25fab093fa feat(timer): 新增 run_type 调度、host_id 投递和日志清理
T7: TimerBase shouldExecuteTask() - main/auto/all/manual/disabled modes
    with two-phase DB row lock for auto mode
T8: TimerControllerBase - host_id param, logStart/logEnd methods
    TimerServiceBase - inject host_id into site URLs
T9: TimerLogClean command - php think admin:timer:log:clean --days=30
2026-05-26 18:33:42 +08:00

87 lines
2.3 KiB
PHP

<?php
namespace base\common\controller;
use app\admin\model\SystemTimerLog;
use app\common\controller\ToolsController;
use think\facade\Cache;
class TimerControllerBase extends ToolsController
{
protected $frequency = null;
protected $concurrency = 1;
protected $concurrencyId = 0;
protected $hostId = null;
public function initialize()
{
parent::initialize();
$concurrency_id = $this->request->param('concurrency_id', 0);
if ($concurrency_id > $this->concurrency) {
$this->error('concurrency id error');
}
$this->concurrencyId = $concurrency_id;
$concurrency_count = $this->request->param('concurrency_count', 1);
if ($concurrency_count > $this->concurrency) {
$this->error('concurrency count error');
}
$this->hostId = $this->request->param('host_id', '');
if (is_int($this->frequency)) {
$this->protectVisit($this->frequency);
}
}
protected function protectVisit(int $frequency)
{
$cache_tag = 'timer_protect';
$cache_key = 'timer_protect_' . md5($this->request->url());
$last_exec_time = Cache::get($cache_key, 0);
if ($last_exec_time >= time() - $frequency) {
return $this->error('请不要频繁请求');
}
Cache::tag($cache_tag)->set($cache_key, time());
}
public function logStart(string $taskName): int
{
$data = [
'task_name' => $taskName,
'node_id' => $this->hostId,
'run_type' => '',
'start_time' => time(),
'end_time' => 0,
'duration' => 0,
'status' => 'running',
'error_message' => null,
'concurrency_id' => $this->concurrencyId,
'create_time' => time(),
];
$log = SystemTimerLog::create($data);
return $log->id;
}
public function logEnd(int $logId, string $status = 'success', ?string $errorMessage = null): void
{
$log = SystemTimerLog::find($logId);
if ($log) {
$endTime = time();
$log->end_time = $endTime;
$log->duration = ($endTime - $log->start_time) * 1000; // ms
$log->status = $status;
$log->error_message = $errorMessage;
$log->save();
}
}
}