73 lines
2.3 KiB
PHP
73 lines
2.3 KiB
PHP
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | YwxApp [ WE CAN DO IT JUST THINK ]
|
|
// +----------------------------------------------------------------------
|
|
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
|
|
// +----------------------------------------------------------------------
|
|
// | Author: ywxapp<admin@ywxapp.cn>
|
|
// +----------------------------------------------------------------------
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace addon\haonav\controller;
|
|
use ywxapp\controller\FrontendBase;
|
|
|
|
use addon\haonav\model\Links as LinksModel;
|
|
use addon\haonav\model\Configure as ConfigureModel;
|
|
|
|
/**
|
|
* 计划任务入口(可通过服务器 cron 调用)
|
|
*
|
|
* 示例:curl "https://你的域名/haonav/task/checklinks?token=你的检测令牌"
|
|
* 令牌在「导航配置」中设置 check_token,为空则拒绝执行。
|
|
*/
|
|
class Task extends FrontendBase
|
|
{
|
|
protected $noNeedLogin = ['*'];
|
|
protected $noNeedVerify = ['*'];
|
|
|
|
|
|
protected function initialize()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* 死链检测(供 cron 调用)
|
|
*/
|
|
public function checkLinks()
|
|
{
|
|
$token = $this->request->param('token', '');
|
|
$realToken = ConfigureModel::getVal('check_token', '');
|
|
|
|
if ($realToken === '' || $token !== $realToken) {
|
|
return $this->result->error('token 校验失败', 403);
|
|
}
|
|
|
|
$stats = LinksModel::checkAllLinks();
|
|
return $this->result->success($stats, '检测完成');
|
|
}
|
|
|
|
/**
|
|
* 惰性自动巡检(前台页面加载后异步 ping,无 cron 环境的兜底方案)
|
|
*
|
|
* - 需在「导航配置」开启 enable_auto_check
|
|
* - 缓存锁限频:每小时最多执行一批(5 条,超时 5s),不影响页面渲染
|
|
*/
|
|
public function autoCheck()
|
|
{
|
|
if ((int)ConfigureModel::getVal('enable_auto_check', '0') !== 1) {
|
|
return $this->result->success(['skipped' => 'disabled']);
|
|
}
|
|
$lockKey = 'haonav_autocheck_lock';
|
|
if (\think\facade\Cache::get($lockKey)) {
|
|
return $this->result->success(['skipped' => 'locked']);
|
|
}
|
|
\think\facade\Cache::set($lockKey, 1, 3600);
|
|
|
|
ignore_user_abort(true);
|
|
@set_time_limit(60);
|
|
$stats = LinksModel::checkBatch(5, 5);
|
|
return $this->result->success($stats, '巡检完成');
|
|
}
|
|
}
|