Files
YwxAppThink/addon/haonav/command/CheckLinks.php
T

69 lines
2.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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\command;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
use addon\haonav\model\Links as LinksModel;
/**
* haonav 死链巡检命令
*
* 用法:
* php think haonav:checklinks # 全量检测
* php think haonav:checklinks --limit=50 # 只检测最久未检测的 50 条
*
* crontab 示例(每天凌晨 3 点全量):
* 0 3 * * * cd /path/to/site && php think haonav:checklinks >> runtime/haonav_check.log 2>&1
*/
class CheckLinks extends Command
{
protected function configure()
{
$this->setName('haonav:checklinks')
->addOption('limit', null, Option::VALUE_OPTIONAL, '本次最多检测条数(0=全部,按最久未检测优先)', '0')
->addOption('timeout', null, Option::VALUE_OPTIONAL, '单条检测超时秒数', '8')
->setDescription('haonav 网址导航死链巡检(更新 status_code / last_check_at');
}
protected function execute(Input $input, Output $output)
{
$limit = max(0, (int)$input->getOption('limit'));
$timeout = max(1, (int)$input->getOption('timeout'));
set_time_limit(0);
$output->writeln('[haonav] 开始死链巡检 limit=' . ($limit ?: '全部') . ' timeout=' . $timeout . 's ...');
$start = microtime(true);
$stats = $limit > 0
? LinksModel::checkBatch($limit, $timeout)
: LinksModel::checkAllLinks($timeout);
$output->writeln(sprintf(
'[haonav] 完成:共 %d 条,正常 %d,异常 %d,耗时 %.1fs',
$stats['total'],
$stats['ok'],
$stats['dead'],
microtime(true) - $start
));
if (!empty($stats['offlined'])) {
$output->writeln('[haonav] 已自动下线 ' . $stats['offlined'] . ' 条死链(阈值见 deadlink_threshold 配置)');
}
if (!empty($stats['recovered'])) {
$output->writeln('[haonav] 已自动恢复 ' . $stats['recovered'] . ' 条(deadlink_recover 已开启)');
}
return 0;
}
}