当前位置:首页>python>Python配置管理的正确姿势:用dataclass告别"配置地狱"

Python配置管理的正确姿势:用dataclass告别"配置地狱"

  • 2026-07-02 16:48:06
Python配置管理的正确姿势:用dataclass告别"配置地狱"

🤔 你有没有遇到过这种情况

周五下午四点半,你正准备收工。突然线上告警——服务挂了。

排查半小时,最终发现:有人把 config.yaml 里的 port 写成了字符串 "5432",而不是整数 5432。数据库连接失败,一行代码都没改,系统就这么趴下了。

这不是段子。这是我在一个真实项目里亲眼目睹的事故。

配置管理,听起来是个不起眼的小事,但它藏着的坑,能让你在最不该出问题的时候出问题。今天咱们就聊聊:怎么用 Python 原生的 dataclass,把这个"配置地狱"彻底治住——零第三方依赖,类型安全,上手即用


😤 传统做法,到底烂在哪儿

先说说大多数项目的现状。

python1import yaml23with open("config.yaml"as f:4    config = yaml.safe_load(f)56# 然后满天飞的字典访问7db_host = config["database"]["host"]8db_port = config["database"]["port"]   # 这是 int?还是 str?天知道

这种写法,问题不是一两个:

类型完全不可控。 YAML 解析出来的东西,port 可能是整数,也可能是字符串——取决于你怎么写配置文件。IDE 不知道,mypy 不知道,只有运行时才知道。等你知道的时候,服务已经挂了。

没有任何验证。log_level 写成 "verbose" 这种根本不存在的值?程序照样启动,直到某个地方真正用到它,才会以一种奇怪的方式崩掉。

属性访问全靠记忆。config["database"]["max_connections"] 还是 config["db"]["max_conn"]?字典嵌套三层以后,你自己都不记得键名了。IDE 的自动补全?不存在的。

敏感信息乱放。 数据库密码直接写死在配置文件里,然后这个文件不小心被提交到了 Git 仓库……这种事每年都在发生。


🏗️ dataclass 方案:结构即文档

换个思路。我们用 dataclass 把配置结构显式地定义出来。

python1from dataclasses import dataclass, field2from typing import ListOptional34@dataclass5class DatabaseConfig:6    host: str7    port: int8    name: str9    user: str10    password: str11    max_connections: int = 1012    timeout: float = 30.01314@dataclass15class AppConfig:16    debug: bool17    log_level: str18    allowed_hosts: List[str] = field(default_factory=list)19    secret_key: Optional[str] = None2021def __post_init__(self):22        valid_levels = {"DEBUG""INFO""WARNING""ERROR""CRITICAL"}23if self.log_level.upper() not in valid_levels:24raise ValueError(25f"log_level 无效: '{self.log_level}',"26f"可选值为 {valid_levels}"27            )28        self.log_level = self.log_level.upper()

这段代码,本身就是文档。任何人打开这个文件,不用看注释,不用看 README,一眼就知道:数据库配置需要哪些字段,每个字段是什么类型,哪些有默认值。

__post_init__ 是这里的点睛之笔——它在 __init__ 执行完毕后自动调用,专门用来做业务级校验。log_level 写错了?对不起,对象根本就创建不出来,错误在最早的时刻就暴露了。


🔧 从 YAML 到对象:类型转换的正确方式

光有结构定义还不够,还得有个靠谱的加载机制。

python1@dataclass2class Config:3    database: DatabaseConfig4    app: AppConfig56@classmethod7def from_yaml(cls, path: str = "config.yaml") -> "Config":8        config_path = Path(path)9if not config_path.exists():10raise FileNotFoundError(f"配置文件不存在: {path}")1112with open(config_path, encoding="utf-8"as f:13            raw = yaml.safe_load(f) or {}1415        db_raw = raw.get("database", {})16        app_raw = raw.get("app", {})1718# 环境变量优先级高于配置文件19        db_raw["password"] = os.getenv("DB_PASSWORD", db_raw.get("password"""))2021return cls(22            database=DatabaseConfig(23                host=str(db_raw["host"]),24                port=int(db_raw["port"]),      # 强制转换,不信任 YAML 的解析结果25                name=str(db_raw["name"]),26                user=str(db_raw["user"]),27                password=str(db_raw["password"]),28                max_connections=int(db_raw.get("max_connections"10)),29                timeout=float(db_raw.get("timeout"30.0)),30            ),31            app=AppConfig(32                debug=bool(app_raw.get("debug"False)),33                log_level=str(app_raw.get("log_level""INFO")),34                allowed_hosts=list(app_raw.get("allowed_hosts", [])),35                secret_key=app_raw.get("secret_key"),36            )37        )

注意每一个字段都做了显式类型转换——int(db_raw["port"]),而不是直接用 db_raw["port"]。这看起来有点啰嗦,但这一行代码,能挡住 YAML 解析的类型不确定性。文章开头那个周五下午的事故,就是这里没做转换。

还有一个细节值得单独说:os.getenv("DB_PASSWORD", ...) 这行。密码不应该存在配置文件里,配置文件通常会进代码仓库,密码一旦进了 Git,就很难彻底清除。环境变量的方式,既适合本地开发(.env 文件),也适合容器化部署(K8s Secret、Docker env),是目前业界最主流的做法。


✅ 使用体验:IDE 终于"懂你"了

换成这套方案以后,使用体验有质的变化:

python1cfg = Config.from_yaml("config.yaml")23# 完整的自动补全,IDE 知道每个字段的类型4print(cfg.database.host)        # str,确定的5print(cfg.database.port)        # int,不是字符串6print(cfg.app.log_level)        # 已验证,已统一大写78# 拼写错误?IDE 直接标红,mypy 静态检查也会报错9# print(cfg.database.hostt)     # AttributeError,立即发现

以前用字典的时候,config["database"]["hostt"] 这种拼写错误,IDE 完全没法发现,只能等运行时 KeyError 爆出来。现在 cfg.database.hostt 这种写法,IDE 实时标红,mypy 静态检查也会拦截——错误在离键盘最近的地方就被消灭了。


⚠️ 一个必须知道的坑

这套方案有一个隐蔽的问题,我在项目里踩过,值得专门说一下。

__post_init__ 的验证逻辑,只在对象初始化时执行一次。如果后续代码直接修改属性:

python1cfg.app.log_level = "verbose"   # 非法值,但不会报错!

验证逻辑不会重新触发。这个值就这么安静地写进去了,没有任何提示。

针对这个问题,有三条路可以走:

方案一:frozen=True(最简单,完全不可变)

python1@dataclass(frozen=True)2class AppConfig:3    log_level: str4    ...5# 任何赋值都会抛出 FrozenInstanceError

适合配置对象——加载一次,只读使用,这是最符合配置语义的做法。

方案二:@property + 私有字段(可读写,但受控)

python1@dataclass2class AppConfig:3    _log_level: str = field(init=False, repr=False)4    log_level_raw: str = "INFO"56def __post_init__(self):7        self.log_level = self.log_level_raw  # 触发 setter89@property10def log_level(self) -> str:11return self._log_level1213@log_level.setter14def log_level(self, value: str):15        valid = {"DEBUG""INFO""WARNING""ERROR""CRITICAL"}16if value.upper() not in valid:17raise ValueError(f"非法 log_level: {value!r}")18        self._log_level = value.upper()

代码稍多,但无论初始化还是后续赋值,setter 始终执行验证。适合需要在运行时动态调整配置的场景(比如热更新日志级别)。

方案三:上 Pydantic

如果项目规模变大,验证逻辑越来越复杂,那就别跟自己较劲了——直接用 Pydantic,它原生支持 validate_assignment=True,赋值时自动触发验证,还有更丰富的类型系统和错误提示。这是另一个话题,后面可以单独聊。


📁 配置文件参考

对应的 config.yaml 长这样:

yaml1database:2  host: localhost3  port: 54324  name: mydb5  user: admin6  password: ""          # 生产环境通过 DB_PASSWORD 环境变量覆盖78app:9  debug: false10  log_level: info       # 大小写无所谓,代码里会统一转大写11  allowed_hosts:12    - 127.0.0.113    - 192.168.1.0/24

密码字段留空是刻意的设计——提醒自己和团队成员:这个值应该来自环境变量,不应该填在这里。


🎯 什么时候用这套方案

这套方案的适用边界比较清晰:

适合用的场景——小到中型项目,配置结构相对稳定,团队不想引入额外依赖,或者在受限环境(离线、私有化部署)里没法装第三方包。

可以考虑升级的场景——配置字段超过三十个,验证规则复杂(嵌套校验、跨字段依赖),或者需要从多个来源(文件、环境变量、命令行参数、远程配置中心)合并配置,这时候 Pydantic Settings 或者 Dynaconf 会更顺手。

技术选型没有对错,只有合不合适。一个五人团队的内部工具,用 dataclass + 手动验证完全够用,不需要为了"架构先进"引入一堆依赖。


💬 最后说一句

我见过太多项目,配置管理是最不被重视的部分——直到它出问题。

一个好的配置方案,应该让错误在离键盘最近的地方暴露,而不是等到生产环境。dataclass 给了我们结构,__post_init__ 给了我们验证时机,显式类型转换给了我们确定性,环境变量覆盖给了我们安全性。

这四件事加在一起,基本上能挡住配置管理里 80% 的坑。

你们项目里的配置管理是怎么做的?有没有踩过类似的坑?欢迎在评论区聊聊。


#Python#后端开发#代码质量#工程实践#配置管理

最新文章

随机文章

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