乐于分享
好东西不私藏

Hermes Agent 源码-认证系统与配置管理

Hermes Agent 源码-认证系统与配置管理

Hermes Agent 源码解析

第 13 讲:认证系统与配置管理——Provider Registry、OAuth 管线、Credential Pool 与安全策略

基于 Hermes Agent v0.16.0 源码 · 2026-06-26

一、配置即基础设施:Hermes 的双轨配置体系

前十二讲我们覆盖了 Hermes 从核心架构到 CLI 交互的全链路。这一讲我们深入到 Hermes 的认证系统配置管理——这两个模块是所有 Provider 连接、密钥管理、安全策略的根基。

Hermes 的配置体系采用双轨设计config.yaml 管行为,.env 管密钥。这个分离不是简单的偏好——它是安全架构的核心约束。

📦 本讲核心文件

hermes_cli/config.py(291KB)— 配置管理核心

hermes_cli/auth.py(314KB)— 认证管线

agent/credential_pool.py(102KB)— 凭证池

agent/credential_sources.py(19KB)— 凭证源抽象

agent/credential_persistence.py(5KB)— 磁盘边界清洗

hermes_cli/env_loader.py(13KB)— 环境变量加载

hermes_cli/secrets_cli.py(22KB)— 密钥 CLI

二、配置加载管线:从磁盘到内存的四层过滤

config.py 是 Hermes 的配置中枢,6530 行代码实现了一个完整的配置管线。配置加载不是简单的 yaml.safe_load(),而是经过四层处理的完整流水线:

配置加载四阶段

阶段 函数 职责
1. 原始读取 read_raw_config() YAML 解析,缓存于 (mtime_ns, size)
2. 默认合并 _deep_merge() 用户配置与 DEFAULT_CONFIG 深度合并
3. 迁移与归一化 _normalize_* 旧版 key 迁移、类型归一化
4. 环境变量展开 _expand_env_vars() ${VAR} 占位符替换为 .env 值

Hermes 的配置系统有一个关键设计决策:配置缓存以 (mtime_ns, size) 为键。这意味着:

🔹 文件内容未变 → 直接返回缓存副本(~265us vs ~13ms 全解析)

🔹 文件修改 → mtime 改变 → 自动失效缓存

🔹 原子写入 atomic_yaml_write() 产生新 inode → 缓存自然刷新

🔹 Profile 切换改变 HERMES_HOME → 路径不同 → 缓存隔离

对于只读调用方,Hermes 提供了 load_config_readonly() 快速路径——跳过 deepcopy 节省 ~135us。Agent loop 中 get_provider_request_timeout() 每轮调用 20-50 次,这个优化可显著降低 GC 压力。

⚠️ 损坏配置保护机制

当 YAML 解析失败时,Hermes 不会崩溃——而是回退到 DEFAULT_CONFIG,同时将损坏的文件自动备份为 config.yaml.corrupt.{timestamp}.bak。备份去重逻辑检查文件尺寸,避免同一损坏反复生成备份。

三、Provider Registry:40+ 推理提供商的统一注册表

auth.py 中的 PROVIDER_REGISTRY 是 Hermes 支持所有推理提供商的单一事实来源。每个 ProviderConfig 定义了:

@dataclass
class ProviderConfig:
    id: str                       # 唯一标识,如 "nous", "anthropic"
    name: str                     # 显示名称
    auth_type: str                # "oauth_device_code", "oauth_external",
                                  # "oauth_minimax", "api_key", "external_process"
    portal_base_url: str          # OAuth 门户地址
    inference_base_url: str       # 推理 API 端点
    client_id: str                # OAuth Client ID
    scope: str                    # OAuth 作用域
    api_key_env_vars: tuple       # API Key 环境变量名(优先级排序)
    base_url_env_var: str         # Base URL 覆盖环境变量
    extra: Dict[str, Any]         # 扩展字段

注册表覆盖了四大类别的提供商:

类别 提供商示例 认证类型
OAuth Device Code Nous Portal oauth_device_code
OAuth External (PKCE) OpenAI Codex, xAI, Qwen, Gemini oauth_external
OAuth MiniMax MiniMax (global/cn) oauth_minimax
API Key Anthropic, Gemini, Kimi, DeepSeek, 等 20+ api_key
External Process Copilot ACP external_process

Provider 别名系统进一步降低了用户认知负担。resolve_provider() 维护了一个 60+ 条目的别名映射表,支持 "claude""anthropic""glm""zai" 等自然映射。插件系统注册的 provider 也会自动注入别名表。

四、Provider 解析优先级链

resolve_provider() 实现了 Hermes 的智能 Provider 选择逻辑。当用户设置 provider: "auto" 时,系统按以下优先级自动检测:

Auto-detect 优先级链

1. auth.json 中的 active_provider(有有效凭据的 OAuth 提供商)

2. CLI 显式传入的 api_key/base_url → "openrouter"

3. OPENAI_API_KEY / OPENROUTER_API_KEY 环境变量 → "openrouter"

4. 凭证池中的 OpenRouter 手动条目(hermes auth add

5. 遍历注册表,检测各 Provider 专属环境变量(GLM_API_KEY, KIMI_API_KEY 等)

6. 兜底 → "openrouter"

这个设计的关键在于:OAuth 凭据优先于 API Key。OAuth 凭据通常代表用户已登录的付费账户,自动刷新且更安全(不暴露长期密钥)。API Key 作为降级选项,确保即使没有 OAuth 也能工作。

五、OAuth 认证管线:三种 OAuth 模式的实现

Hermes 实现了三种 OAuth 模式,每种适配不同的提供商需求:

5.1 OAuth Device Code Flow(Nous Portal)

Device Code 流程适合无浏览器环境(SSH 远程服务器、headless 容器):

+----------------+          +------------------+
| Hermes CLI     |          | Nous Portal      |
| (auth.py)      |          | (portal.nous...) |
+----------------+          +------------------+
       |                           |
       |--- device_code_request --->|
       |                           |
       |<-- device_code + user_code-|
       |                           |
       |  [用户手动打开 URL 并输入码]  |
       |                           |
       |--- poll_interval=5s ------->|
       |                           |
       |<-- access_token + refresh--|
       |                           |
       |  [存储到 auth.json]         |
       |                           |

核心实现细节:

🔹 NOUS_INFERENCE_INVOKE_SCOPE = "inference:invoke" — 最小权限原则,只请求推理调用权限

🔹 ACCESS_TOKEN_REFRESH_SKEW_SECONDS = 120 — 提前 2 分钟刷新,避免边界过期

🔹 NOUS_AUTH_PATH_INVOKE_JWT = "invoke_jwt" — Invoke JWT 路径,使用 scoped access_token 直接推理

5.2 OAuth External / Loopback PKCE(Codex, xAI, Qwen, Gemini)

Loopback PKCE 流程适合有浏览器但需要安全认证的场景:

+----------+     +----------------+     +-----------+
| Browser  |     | Hermes Local   |     | OAuth     |
| (用户)    |     | HTTP Server    |     | Provider  |
+----------+     | (127.0.0.1:PPPP)|     +-----------+
      |          +----------------+           |
      |--- 访问授权URL ----------------------->|
      |          |                            |
      |<-- 重定向到回调URL --------------------|
      |          |                            |
      |--- 回传到本地服务器 ------------------>|
      |          |                            |
      |          |--- 提取code, 换token ------->|
      |          |                            |
      |          |<-- access_token + refresh ---|
      |          |                            |
      |          |  [存储到 auth.json]          |

每个 Provider 有独立的 Client ID 和刷新偏置:

Provider Client ID Refresh Skew
OpenAI Codex app_EMoamEEZ73f0CkXaXp7hrann 120s
xAI Grok b1a00492-073a-47ea-... 120s
Qwen f0304373b74a44d2b584... 120s
Gemini (Google OAuth) 60s
MiniMax 78257093-7e40-4613... 60s

5.3 SSH 远程 OAuth 支持

Hermes 的 OAuth 系统支持通过 SSH 端口转发完成远程认证——这在无桌面环境的服务器上尤为关键。文档指引用户通过 -L 端口转发将本地回调端口映射到远程,实现无缝认证。

六、Credential Pool:多凭证管理与故障转移

credential_pool.py 实现了 Hermes 的多凭证池系统,支持同一 Provider 下多个密钥的自动轮换和故障转移。这是 Hermes 区别于大多数 AI 代理的关键特性之一。

6.1 PooledCredential 数据模型

@dataclass
class PooledCredential:
    provider: str                  # 提供商标识
    id: str                        # 唯一 ID (UUID)
    label: str                     # 用户标签
    auth_type: str                 # "oauth" / "api_key"
    priority: int                  # 优先级 (数字越小越优先)
    source: str                    # 来源: "device_code", "env:*",
                                   # "manual:*", "config:*", "claude_code"
    access_token: str              # 访问令牌
    refresh_token: Optional[str]   # 刷新令牌
    last_status: Optional[str]     # "ok" / "exhausted" / "dead"
    last_error_code: Optional[int] # 401, 429, 402...
    last_error_reset_at: float     # 错误恢复时间戳
    expires_at: Optional[str]      # 过期时间
    base_url: Optional[str]        # 推理端点
    inference_base_url: Optional[str]
    agent_key: Optional[str]       # Agent 专用密钥

6.2 凭证状态机

每个凭证有三种状态,构成一个简单的状态机:

STATUS_OK = "ok"          # 正常可用
STATUS_EXHAUSTED = "exhausted"  # 临时不可用(冷却中)
STATUS_DEAD = "dead"       # 永久失效(不可恢复)

# 终端认证错误——凭证永久无效
_TERMINAL_AUTH_REASONS = frozenset({
    "token_invalidated",   # OpenAI: token 被撤销
    "token_revoked",       # OAuth RFC 7009
    "invalid_token",       # RFC 6750
    "invalid_grant",       # RFC 6749: refresh_token 被拒
    "unauthorized_client", # RFC 6749
    "refresh_token_reused",# 单次刷新令牌被其他进程消费
})

6.3 轮换策略

策略 行为 适用场景
fill_first 优先用高优先级凭证,用完再换 有免费额度的主密钥
round_robin 轮询所有可用凭证 均匀分摊配额
random 随机选择 避免模式化请求
least_used 选择使用次数最少的 均衡消耗

6.4 冷却时间策略

凭证耗尽后的冷却时间根据错误类型动态调整:

🔹 401 认证失败:5 分钟(短暂冷却,单密钥场景可恢复)

🔹 429 速率限制:1 小时(等待速率窗口恢复)

🔹 402 配额耗尽:1 小时(等待计费周期重置)

🔹 Provider 返回 reset_at:使用 Provider 指定的时间(覆盖默认值)

七、凭证源抽象与统一移除

credential_sources.py 定义了一个优雅的抽象层,统一了 10+ 种凭证来源的移除行为。在引入这个模块之前,每种来源在 auth_remove_command 中有独立的 if/elif 分支——而且部分来源根本没有移除逻辑,导致 hermes auth remove 后下次 load_pool() 又自动恢复了。

现在的架构通过 RemovalStep 注册表实现统一处理:

@dataclass
class RemovalStep:
    provider: str          # 提供商或 "*" (任意)
    source_id: str         # 来源标识
    remove_fn: Callable    # 实际清理函数
    description: str       # 描述

# 移除三步走:
# 1. 清理外部可读状态(.env 行、auth.json 块、OAuth 文件等)
# 2. 在 auth.json 中抑制 (provider, source_id)
# 3. 返回 RemovalResult(清理报告 + 诊断提示)

支持的凭证来源:

来源 标识 存储位置
环境变量 env:* os.environ / .env
Claude Code claude_code ~/.claude/.credentials.json
Hermes PKCE hermes_pkce ~/.hermes/.anthropic_oauth.json
Device Code device_code auth.json providers.*
Qwen CLI qwen-cli ~/.qwen/oauth_creds.json
GitHub CLI gh_cli gh auth token
配置文件 config:* custom_providers 条目
手动添加 manual:* hermes auth add

八、安全策略:环境变量黑名单与磁盘边界清洗

Hermes 的安全设计有两道关键防线:

8.1 环境变量写入黑名单

_ENV_VAR_NAME_DENYLIST 阻止 Dashboard 和环境写入器修改可能影响子进程执行的关键环境变量:

_ENV_VAR_NAME_DENYLIST = frozenset({
    # 动态链接器
    "LD_PRELOAD", "LD_LIBRARY_PATH", "LD_AUDIT", "LD_DEBUG",
    "DYLD_INSERT_LIBRARIES", "DYLD_LIBRARY_PATH", ...
    # Python 解释器
    "PYTHONPATH", "PYTHONHOME", "PYTHONSTARTUP", ...
    # Node 解释器
    "NODE_OPTIONS", "NODE_PATH",
    # 通用
    "PATH", "SHELL", "BROWSER", "EDITOR", "VISUAL", "PAGER",
    # Git
    "GIT_SSH_COMMAND", "GIT_EXEC_PATH", "GIT_SHELL",
    # Hermes 运行时位置
    "HERMES_HOME", "HERMES_PROFILE", "HERMES_CONFIG", "HERMES_ENV",
})

关键设计:只阻止写入,不阻止读取。用户手动设置的这些变量仍然正常工作——Dashboard 只是不能通过写入接口修改它们。这是一个精细的白名单策略,HERMES_* 前缀整体不被阻止(大量集成密钥使用此前缀),只阻止特定的运行时位置变量。

8.2 磁盘边界清洗

credential_persistence.py 实现了磁盘写入前的凭证清洗。只有 Hermes 自己管理的凭据才会完整持久化到 auth.json

# 可持久化的 (provider, source) 对
_PERSISTABLE_PROVIDER_SOURCES = frozenset({
    ("anthropic", "hermes_pkce"),
    ("minimax-oauth", "oauth"),
    ("nous", "device_code"),
    ("openai-codex", "device_code"),
    ("xai-oauth", "loopback_pkce"),
})

# 敏感字段清洗列表
_SECRET_VALUE_KEYS = frozenset({
    "access_token", "refresh_token", "agent_key",
    "api_key", "apikey", "api_token", "auth_token",
    "bearer_token", "client_secret", "credential",
    "id_token", "oauth_token", "private_key",
    "secret_key", "session_token", "password", ...
})

所有非 Hermes 管理的凭据(如从 Claude CodeQwen CLI 借用的密钥)在写入磁盘前被剥离原始值,只保留元数据。这确保了即使 auth.json 被泄露,外部密钥也不会暴露。

九、Auth Store 持久化与跨进程锁

auth.json 是 Hermes 的认证状态数据库。读写操作使用跨进程文件锁保护:

@contextmanager
def _auth_store_lock(timeout_seconds=15.0):
    """跨进程建议锁,用于 auth.json 读写。可重入。
    
    锁排序不变量:当此锁与 _CONFIG_LOCK 同时持有时,
    总是先获取 _auth_store_lock 再获取 _CONFIG_LOCK。
    """
    # Linux: fcntl.flock()
    # Windows: msvcrt.locking()
    # fallback: threading.RLock()
    yield

AUTH_STORE_VERSION = 1
AUTH_LOCK_TIMEOUT_SECONDS = 15.0

锁排序不变量(Lock ordering invariant)是 Hermes 防止死锁的核心机制。当代码路径需要同时持有 auth 锁和配置锁时,必须按固定顺序获取——这消除了循环等待的可能性。

_save_auth_store() 还自动收紧父目录权限到 0o700,防止同级进程遍历到凭据文件。这是一个深度防御(defense in depth)措施。

十、.env 文件的加载与清洗

load_env() 函数实现了 .env 文件的加载,包含两个关键优化:

🔹 mtime 缓存:解析后的字典以 (path, mtime, size) 为键缓存。Hermes 的 OAuth 刷新和菜单渲染会调用 get_env_value() 数十到数百次,避免重复解析可节省 ~300ms CPU。

🔹 行清洗_sanitize_env_lines() 处理两种已知的损坏模式:

# 损坏模式 1: 多条目合并到一行
ANTHROPIC_API_KEY=sk-...OPENAI_BASE_URL=https://...
# 清洗后:
ANTHROPIC_API_KEY=sk-...
OPENAI_BASE_URL=https://...

# 损坏模式 2: 不完整的设置残留
SOME_KEY=***
# 清洗后: 行被丢弃

清洗使用已知键集合(OPTIONAL_ENV_VARS + _EXTRA_ENV_KEYS)进行匹配,避免误伤值中包含大写字母的合法条目。

十一、架构总结与关键设计模式

Hermes 认证与配置体系的关键设计模式

1. 双轨配置:config.yaml(行为)+ .env(密钥),安全与灵活兼顾

2. Provider Registry:单一事实来源,40+ 提供商统一注册

3. 三级 OAuth:Device Code / Loopback PKCE / MiniMax 专用,适配不同环境

4. Credential Pool:多密钥轮换、故障转移、冷却时间

5. 凭证源抽象:RemovalStep 注册表,统一 10+ 种来源的移除

6. 磁盘边界清洗:外部凭据不落地,只保留元数据

7. 环境变量黑名单:阻止 Dashboard 写入危险变量

8. 跨进程锁 + 锁排序:auth.json 并发安全

9. mtime 缓存:配置和 .env 的高效缓存策略

10. 损坏保护:YAML 解析失败自动备份,回退到默认值

🔑 核心架构原则

Hermes 的认证与配置体系遵循一个核心原则:凭据永远不意外泄露。无论是磁盘边界清洗、环境变量黑名单、还是跨进程锁,每一层防御都围绕这个原则构建。同时,系统保持了足够的灵活性——40+ Provider 支持、多凭证池、自动 Provider 检测——让用户在不同环境和需求下都能顺畅使用。

十二、预告:下一讲——预算控制与限流

下一讲我们将深入 Hermes 的预算控制系统——credits_tracker.pyrate_limit_tracker.pyiteration_budget.pynous_rate_guard.py。我们将解析 Hermes 如何跟踪 API 成本、实施速率限制、防止预算超支。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-26 22:38:47 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/802852.html
  2. 运行时间 : 0.229594s [ 吞吐率:4.36req/s ] 内存消耗:4,650.14kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=48338f1c9ff00ba5e57e52b898348470
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001197s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001634s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000666s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.007243s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001488s ]
  6. SELECT * FROM `set` [ RunTime:0.000611s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001820s ]
  8. SELECT * FROM `article` WHERE `id` = 802852 LIMIT 1 [ RunTime:0.002509s ]
  9. UPDATE `article` SET `lasttime` = 1782484727 WHERE `id` = 802852 [ RunTime:0.024317s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.013230s ]
  11. SELECT * FROM `article` WHERE `id` < 802852 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001658s ]
  12. SELECT * FROM `article` WHERE `id` > 802852 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001209s ]
  13. SELECT * FROM `article` WHERE `id` < 802852 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001786s ]
  14. SELECT * FROM `article` WHERE `id` < 802852 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001689s ]
  15. SELECT * FROM `article` WHERE `id` < 802852 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.009215s ]
0.233641s