简介
本章节面向 DouPHP 的环境变量与运行期配置体系,说明:
- 环境变量的概念与作用:将“随环境变化”的配置从代码中剥离,实现开发、测试、生产环境的差异化。
- 当前项目的加载机制:通过引导脚本在应用启动早期加载配置文件,并定义关键常量(如数据库连接、调试开关、应用密钥等)。
- 安全与敏感信息:结合现有安全配置与加密工具,给出敏感信息的存储与管理建议。
- 部署最佳实践:容器化与云平台的配置注入方式。
- 工具链支持:IDE、CI/CD 如何配合工作流使用这些配置。
- 常见问题排查:围绕配置缺失、类型错误、代理与 Host 校验等问题提供定位方法。
项目结构
DouPHP 的运行时配置集中在根级 config 目录,由核心引导流程统一加载;安全相关策略集中于 security 配置;入口脚本负责路由与异常处理,并在引导阶段完成配置初始化。
graph TB
A["入口 index.php"] --> B["核心引导 core/bootstrap.php"]
B --> C["站点配置 config/config.php"]
B --> D["安全配置 config/security.php"]
A --> E["前端 Init 与路由调度"]
E --> F["业务模块与服务"]
核心组件
- 引导加载器(core/bootstrap.php)
- 定义应用根路径、配置目录与存储目录。
- 判断 HTTPS 协议,决定是否跳转安装程序。
- 加载站点配置(config/config.php),聚合数据库连接参数为 DOU_DB_CONFIG。
- 注册自动加载、门面别名、DI 容器、Request 单例等基础能力。
- 站点配置(config/config.php)
- 定义数据库主机、库名、用户名、密码、表前缀、字符集、系统标识、管理端目录、API 目录、小程序目录、重写开关、应用密钥、调试开关等。
- 安全配置(config/security.php)
- 可信反向代理列表、可信 Host 白名单、安全响应头、限流存储位置、会话 Cookie 硬化策略。
- 入口与异常处理(index.php)
- 设置路由委托、解析语言前缀、执行 Init::boot、分发路由、统一捕获异常并按 site.debug 输出 HTML 或 JSON。
架构总览
下图展示请求进入后,配置与安全策略的加载顺序及影响范围。
sequenceDiagram
participant U as "客户端"
participant I as "入口 index.php"
participant B as "引导 core/bootstrap.php"
participant C as "站点配置 config/config.php"
participant S as "安全配置 config/security.php"
participant R as "路由与业务"
U->>I : HTTP 请求
I->>B : 引入引导脚本
B->>C : 加载站点配置DB、密钥、调试等
B->>S : 加载安全配置代理、Host、Cookie 等
B-->>I : 完成基础能力注册容器、Request、路由
I->>R : 执行 Init : : boot 与路由分发
R-->>U : 返回响应
详细组件分析
引导与配置加载(core/bootstrap.php)
- 作用
- 定义 ROOT_PATH、CONFIG_PATH、STORAGE_PATH。
- 根据服务器变量判定 HTTPS,并控制未安装时的安装页跳转。
- 加载 config/config.php,提取 $dbhost/$dbname/$dbuser/$dbpass/$prefix 并序列化为 DOU_DB_CONFIG,供后续数据库连接使用。
- 注册自动加载、门面、容器、Request 单例等。
- 关键点
- 配置加载时机极早,确保后续所有服务均可读取到一致的配置。
- 数据库配置收敛为单一常量,避免散落的配置源导致不一致。
- 优化建议
- 若需按环境切换配置,可在 bootstrap 阶段根据环境变量决定 include 不同的配置文件,或在 config/config.php 中依据环境变量覆盖默认值。
站点配置(config/config.php)
- 内容
- 数据库连接四要素(主机、库名、用户、密码)、表前缀、字符集、系统标识、管理端/API/小程序目录、重写开关、应用密钥、调试开关。
- 使用方式
- 被引导脚本加载后,其定义的变量会被 bootstrap 收集为 DOU_DB_CONFIG;DOU_APP_KEY、DOU_DEBUG 等常量可直接用于全局逻辑。
- 扩展建议
- 可将不同环境的差异项(如 DB 连接、调试开关、第三方密钥)抽取为环境变量,在 bootstrap 或 config/config.php 中进行合并与覆盖。
安全配置(config/security.php)
- 内容
- trusted_proxies:可信反向代理 IP/CIDR,空表示不信任任何代理。
- trusted_hosts:可信 Host 白名单,非空时未命中域名回落到首项,防止 Host 头污染对外 URL。
- headers:安全响应头基线(X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy、HSTS)。
- throttle:限流后端存储目录与默认策略。
- session:会话 Cookie 硬化(httponly、secure、samesite、use_strict_mode)。
- 作用
- 在 Request 获取 IP/Host 之前生效,确保代理与 Host 校验正确。
- 部署建议
- 在负载均衡/Nginx 反代场景下,务必配置 trusted_proxies;在多域或多子域场景下,配置 trusted_hosts 以杜绝 Host 注入。
入口与异常处理(index.php)
- 作用
- 设置路由委托、解析语言前缀、执行 Init::boot、分发路由。
- 统一捕获异常,按 site.debug 输出 HTML 调试页或 JSON 错误。
- 与配置的关系
- 异常渲染受 site.debug 影响;site.debug 通常与 DOU_DEBUG 联动,便于在生产关闭调试输出。
敏感信息加密与安全管理
- 现状
- 项目中存在 AI 凭据加密工具(devtools/ai-credential-encrypt.php),可用于对敏感信息进行加解密。
- 建议
- 将数据库密码、第三方 API 密钥、应用密钥等敏感信息通过环境变量注入,不在代码中硬编码。
- 在 CI/CD 中从密钥管理服务(如云平台 KMS、Secrets Manager)拉取并注入到运行环境。
- 对静态配置中的敏感字段进行加密存储,并在应用启动时按需解密。
依赖关系分析
- 入口 index.php 依赖引导脚本 core/bootstrap.php。
- 引导脚本依赖站点配置 config/config.php 与安全配置 config/security.php。
- 安全配置影响 Request 的 IP/Host 判定,进而影响后续业务对外 URL 生成与日志审计。
- 数据库连接依赖 bootstrap 聚合的 DOU_DB_CONFIG。
graph LR
Index["index.php"] --> Bootstrap["core/bootstrap.php"]
Bootstrap --> SiteCfg["config/config.php"]
Bootstrap --> SecCfg["config/security.php"]
SecCfg --> Req["Request(IP/Host)"]
SiteCfg --> DB["DOU_DB_CONFIG"]
性能考虑
- 配置加载时机早且集中,减少重复 IO 与解析成本。
- 建议在容器化环境中将配置作为只读挂载或环境变量注入,避免运行时频繁读写磁盘。
- 对于高频访问的外部服务密钥,可考虑在进程内缓存(注意生命周期与安全性)。
故障排查指南
- 症状:数据库连接失败
- 检查 config/config.php 中的数据库四要素是否正确;确认 bootstrap 是否成功将其聚合成 DOU_DB_CONFIG。
- 若使用代理,确认 trusted_proxies 已配置,否则 Request::ip() 可能不正确。
- 症状:外部链接 Host 错误或被篡改
- 检查 trusted_hosts 是否配置;未命中时将回落到首项,避免 Host 注入。
- 症状:HTTPS 识别异常
- 检查服务器端口与 REQUEST_SCHEME;必要时在负载均衡层正确设置转发头,并将出口 IP 加入 trusted_proxies。
- 症状:调试信息泄露
- 生产环境关闭 DOU_DEBUG;入口会根据 site.debug 输出 HTML 或 JSON,避免敏感堆栈外泄。
- 症状:会话安全问题
- 检查 session 的 httponly、secure、samesite、use_strict_mode 是否符合预期。
结论
DouPHP 通过引导脚本在应用启动早期集中加载站点与安全配置,形成统一的配置视图。建议将环境差异项(数据库、密钥、调试开关、代理与 Host 白名单等)通过环境变量注入,并结合 CI/CD 与密钥管理服务实现安全的自动化部署。在生产环境严格关闭调试输出,合理配置安全响应头与会话策略,保障系统的稳定性与安全性。
附录
环境变量与 .env 的使用建议
- 由于当前仓库未包含 .env 解析器,推荐以下两种方案:
- 在 bootstrap 阶段根据环境变量动态 include 不同配置文件(如 config/config.dev.php、config/config.prod.php)。
- 在 config/config.php 中读取环境变量并覆盖默认值,保持单一配置入口。
- 常见变量命名约定
- 数据库:DB_HOST、DB_NAME、DB_USER、DB_PASS、DB_PREFIX
- 应用:APP_KEY、DEBUG
- 安全:TRUSTED_PROXIES、TRUSTED_HOSTS
- 第三方:SMTP*、PAY、AI_ 等
- 类型转换与默认值
- 在读取环境变量后进行类型转换(布尔、整数、数组),并提供合理的默认值,避免空值导致的运行时错误。
- 继承机制
- 可通过“基础配置 + 环境覆盖”的方式实现继承:先加载基础配置,再按环境覆盖关键字段。
容器化与云平台部署
- Docker
- 通过 docker run -e 或 docker-compose environment 注入环境变量;将敏感信息放入 Secrets。
- 将 storage 目录挂载为持久卷,避免重启丢失状态。
- Kubernetes
- 使用 ConfigMap 存放非敏感配置,Secret 存放敏感信息;通过 envFrom 或 volume 挂载。
- 云平台
- 使用平台提供的密钥管理服务(如 AWS Secrets Manager、阿里云 KMS)在启动时注入。
工具链集成
- IDE
- 在 IDE 的运行配置中添加环境变量,便于本地调试。
- CI/CD
- 在流水线中注入环境变量与密钥;构建产物不包含敏感信息。
- 发布前校验必要的环境变量是否存在。