mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-07-01 15:32:48 +08:00
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
87 lines
2.3 KiB
PHP
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();
|
|
}
|
|
}
|
|
}
|