文档目录
故障排查

简介

本指南面向DouPHP系统的运维与开发人员,聚焦于常见问题的快速定位与解决,包括启动失败、数据库连接错误、权限问题、性能问题、网络问题(DNS、端口连通性、SSL证书)以及第三方服务集成(支付、邮件、云服务)等。文档同时提供日志分析方法、调试工具使用建议与健康检查方法,帮助你在生产环境中高效排障。

项目结构

DouPHP采用多入口(前台front、后台admin、API)+ 核心框架(core)的分层架构:

  • 入口层:index.php负责请求引导、路由分发与异常兜底。
  • 引导层:core/bootstrap.php完成环境检测、路径常量定义、配置加载、自动加载、容器与门面注册、Request与路由调度器绑定。
  • 配置层:config/下包含数据库与应用配置、安全策略、系统常量等。
  • 业务层:front/admin/api三端各自的路由、控制器、服务、模型与视图。
  • 存储层:storage/用于运行时缓存、会话、限流等。
graph TB
A["index.php<br/>入口与异常处理"] --> B["core/bootstrap.php<br/>引导与初始化"]
B --> C["config/config.php<br/>数据库与应用配置"]
B --> D["config/security.php<br/>安全策略"]
B --> E["config/system.php<br/>系统常量"]
A --> F["前端/后台/API 路由与控制器"]
F --> G["业务服务/模型/存储"]

核心组件

  • 入口与异常处理:index.php在请求生命周期早期设置路由委托、解析语言前缀、执行Init并调度路由;对未捕获异常进行统一记录与渲染(HTML或JSON)。
  • 引导与初始化:core/bootstrap.php完成PHP版本检测、路径常量、协议判定、安装状态检查、配置文件加载、自动加载、DI容器与门面注册、Request与DelegatingRouter的早绑定。
  • 调试异常渲染:SiteDebugExceptionRenderer提供站点级调试开关判断、Whoops HTML调试页输出、API JSON 500响应构造。
  • 安全与信任代理:security.php定义可信代理、可信Host、安全响应头、限流与Session硬化策略。
  • 系统常量:system.php声明前台固定模块、小程序内置模块、保留URL段等系统级常量。

架构总览

请求从index.php进入,经bootstrap.php完成环境与配置初始化后,交由路由系统分发到具体控制器与服务。异常在入口被捕获并依据site.debug与请求类型输出HTML或JSON。安全策略在早期阶段注入,确保后续IP、Host、响应头等处理正确。

sequenceDiagram
participant Client as "客户端"
participant Entry as "index.php"
participant Boot as "core/bootstrap.php"
participant Router as "路由调度"
participant Service as "业务服务"
participant DB as "数据库"
Client->>Entry : HTTP请求
Entry->>Boot : 引导与初始化
Boot-->>Entry : 就绪配置/容器/Request/路由
Entry->>Router : 分发当前路由
Router->>Service : 调用控制器/服务
Service->>DB : 数据访问
DB-->>Service : 结果
Service-->>Router : 响应数据
Router-->>Client : HTTP响应
Note over Entry,Router : 异常在入口统一捕获并渲染

详细组件分析

入口与异常处理流程

  • 入口职责:设置路由委托、解析语言前缀、执行Init、调度路由、发送响应。
  • 异常处理:对DomainException、HttpResponseException、RedirectException分别处理;通用异常通过front_render_uncaught记录并渲染(HTML或JSON),支持site.debug开启时的调试页。
flowchart TD
Start(["请求进入 index.php"]) --> Init["执行 Init::boot()"]
Init --> Dispatch["Route::dispatch()"]
Dispatch --> Response{"返回 Response?"}
Response --> |是| Send["发送响应并退出"]
Response --> |否| Next["继续处理"]
Next --> CatchErr{"捕获异常?"}
CatchErr --> |是| Render["根据 site.debug 与请求类型渲染 HTML/JSON"]
CatchErr --> |否| End(["结束"])
Render --> End

引导与初始化流程

  • PHP版本检测与环境常量定义。
  • 安装状态检查:若未安装且非install入口,跳转至安装程序。
  • 配置加载:优先读取storage/state下的管理目录配置,再加载config/config.php。
  • 自动加载与门面注册:ClassMap + PSR-4,注册常用门面别名。
  • DI容器与路由:提前绑定DelegatingRouter与Request单例,确保Init之前可用。
  • 助手与方法:加载app()、HTTP响应助手、邮件事件监听、场景注册器。
flowchart TD
S(["bootstrap 开始"]) --> Ver["PHP版本检测"]
Ver --> Paths["定义 ROOT/CONFIG/STORAGE 等路径常量"]
Paths --> HTTPS["判定 HTTPS/HTTP"]
HTTPS --> Install{"是否已安装?"}
Install --> |否| Redirect["跳转到安装入口"]
Install --> |是| LoadCfg["加载 storage/state/admin_dir.php 与 config/config.php"]
LoadCfg --> Consts["定义 CORE/LIBRARY/FRONT/API/ADMIN/MINIPROGRAM/PLUGIN 路径"]
Consts --> Autoload["注册自动加载与门面别名"]
Autoload --> Container["初始化 DI 容器"]
Container --> RouterBind["绑定 DelegatingRouter 与 Request 单例"]
RouterBind --> Helpers["加载 app() 与 HTTP 响应助手"]
Helpers --> MailEvents["注册邮件事件监听"]
MailEvents --> Scenes["登记场景注册器"]
Scenes --> E(["bootstrap 结束"])

调试异常渲染器

  • 调试开关:DOU_DEBUG或Config('site.debug')控制,支持多种布尔值解析。
  • JSON请求识别:API端、XMLHttpRequest、Accept含application/json视为JSON请求。
  • Whoops集成:HTML请求在site.debug时输出Whoops调试页;不可用时降级为Plain HTML。
  • API 500:构造标准错误载荷,包含异常类名、文件、行号与堆栈片段。
classDiagram
class SiteDebugExceptionRenderer {
+isSiteDebugEnabled() bool
+isJsonLikeRequest() bool
+shouldRegisterWhoopsGlobal() bool
+resolveDebugChannel() string
+renderAndExitForHtml(e, channel) void
+apiDebugErrors(e) array
+sendApi500(e) void
}

登录与安全相关逻辑

  • 登录校验:密码匹配、旧格式迁移、账户状态检查。
  • 审计日志:登录成功/失败写入审计表,便于追踪。
  • 安全策略:可信代理、可信Host、安全响应头、限流与Session硬化。
sequenceDiagram
participant U as "用户"
participant L as "LoginService"
participant DB as "数据库"
participant AUD as "审计服务"
U->>L : 提交用户名/密码
L->>DB : 查询用户信息
DB-->>L : 用户数据
L->>L : 校验密码与账户状态
alt 登录失败
L->>AUD : 记录登录失败
L-->>U : 返回错误
else 登录成功
L->>AUD : 记录登录成功
L-->>U : 返回成功
end

依赖关系分析

  • 入口依赖引导:index.php依赖bootstrap.php完成环境准备与配置加载。
  • 引导依赖配置:bootstrap.php依赖config/config.php、config/security.php、config/system.php。
  • 异常处理依赖调试渲染器:index.php在异常分支调用SiteDebugExceptionRenderer进行HTML/JSON渲染。
  • 安全策略影响后续处理:security.php中的trusted_proxies与trusted_hosts影响Request的IP与Host判定。
graph LR
Index["index.php"] --> Boot["core/bootstrap.php"]
Boot --> Cfg["config/config.php"]
Boot --> Sec["config/security.php"]
Boot --> Sys["config/system.php"]
Index --> Debug["SiteDebugExceptionRenderer.php"]

性能注意事项

  • 避免在生产环境开启site.debug:调试模式会输出详细堆栈与额外开销。
  • 合理配置可信代理与Host白名单:防止伪造请求头导致缓存投毒或对外链接污染。
  • 关注数据库连接与查询效率:确保连接池、索引与慢查询优化。
  • 限制大对象与批量操作:避免内存峰值过高,必要时分批处理。
  • 监控存储目录权限与空间:确保storage可写且磁盘空间充足。

故障排查指南

启动失败

  • 现象:页面空白、跳转安装页、PHP报错。
  • 可能原因:
    • PHP版本过低。
    • 未安装完成(缺少install.lock)。
    • 配置文件缺失或权限不足。
    • 自动加载或门面注册失败。
  • 诊断步骤:
    • 查看PHP错误日志与Web服务器错误日志。
    • 确认storage/install.lock是否存在。
    • 检查config/config.php与storage/state目录权限。
    • 临时开启site.debug以获取详细异常信息。
  • 解决方案:
    • 升级PHP至要求版本。
    • 运行安装程序生成install.lock。
    • 修正配置文件与目录权限。
    • 关闭site.debug并恢复生产配置。

数据库连接错误

  • 现象:无法连接数据库、查询失败、事务异常。
  • 可能原因:
    • 数据库主机、用户名、密码或库名配置错误。
    • 数据库服务不可达或连接数耗尽。
    • 字符集不匹配导致乱码或插入失败。
  • 诊断步骤:
    • 核对config/config.php中的数据库参数。
    • 使用命令行或工具直连数据库验证连通性。
    • 查看数据库错误日志与慢查询日志。
  • 解决方案:
    • 修正数据库连接参数。
    • 调整数据库最大连接数与超时。
    • 统一字符集为utf-8并确保表结构与字段一致。

权限问题

  • 现象:无法写入storage、上传失败、缓存失效。
  • 可能原因:
    • storage目录无写权限。
    • 文件所有者与Web进程用户不一致。
    • SELinux或AppArmor限制。
  • 诊断步骤:
    • 检查storage目录权限与磁盘空间。
    • 查看Web服务器错误日志与PHP错误日志。
    • 临时提升权限验证是否为权限问题。
  • 解决方案:
    • 将storage目录所有权设置为Web进程用户。
    • 开放必要的SELinux/AppArmor策略。
    • 定期清理过期缓存与日志。

性能问题

  • 现象:页面加载缓慢、接口超时、CPU/内存飙升。
  • 可能原因:
    • 未启用缓存或缓存失效频繁。
    • 数据库慢查询或缺少索引。
    • 大对象处理或批量操作阻塞。
    • 第三方服务调用超时。
  • 诊断步骤:
    • 启用慢查询日志并分析热点SQL。
    • 使用性能分析工具(如Xdebug、APCu)定位瓶颈。
    • 监控Redis/Memcached命中率与连接数。
  • 解决方案:
    • 优化SQL与添加索引。
    • 引入或优化缓存策略。
    • 拆分大任务为异步队列。
    • 设置合理的超时与重试机制。

日志分析方法

  • 错误日志:
    • 查看PHP错误日志与Web服务器错误日志。
    • 关注未捕获异常与致命错误。
  • 访问日志:
    • 分析Nginx/Apache访问日志,定位高频请求与异常状态码。
  • 调试日志:
    • 在site.debug开启时观察Whoops调试页与API JSON 500响应。
    • 结合审计日志追踪关键操作(如登录失败)。

调试工具的使用

  • 错误追踪:
    • 开启site.debug并使用Whoops调试页。
    • 对于API请求,查看JSON 500响应中的errors字段。
  • 性能分析:
    • 使用Xdebug进行函数级耗时分析。
    • 使用APCu监控缓存命中与内存使用。
  • 内存泄漏检测:
    • 使用Xdebug的内存跟踪功能。
    • 关注大对象与循环引用。

系统健康检查

  • 基础检查:
    • 确认PHP版本满足要求。
    • 检查storage目录可写与磁盘空间。
    • 验证数据库连接与字符集。
  • 安全检查:
    • 确认trusted_proxies与trusted_hosts配置正确。
    • 检查安全响应头是否下发。
  • 可用性检查:
    • 使用curl或浏览器访问关键页面与API。
    • 监控错误日志与审计日志。

网络问题排查

  • DNS解析:
    • 使用nslookup或dig验证域名解析。
    • 检查/etc/resolv.conf或系统DNS配置。
  • 端口连通性:
    • 使用telnet或nc测试目标端口可达性。
    • 检查防火墙与负载均衡规则。
  • SSL证书:
    • 使用openssl s_client验证证书链与有效期。
    • 检查CA证书更新与时间同步。

第三方服务集成问题

  • 支付接口:
    • 核对商户号、密钥与回调地址。
    • 查看支付网关返回码与日志。
  • 邮件服务:
    • 检查SMTP服务器配置与认证。
    • 查看邮件发送日志与退信。
  • 云服务:
    • 核对API密钥与权限。
    • 查看云服务控制台错误与配额。

结论

通过理解DouPHP的入口引导、异常处理、安全策略与配置体系,可以快速定位并解决启动、数据库、权限、性能、网络与第三方集成等问题。建议在生产环境关闭调试模式、完善日志与监控、定期健康检查与容量规划,以确保系统稳定运行。

附录

  • 常用命令:
    • 查看PHP错误日志:tail -f /var/log/php-fpm/error.log
    • 查看Nginx访问日志:tail -f /var/log/nginx/access.log
    • 测试数据库连通性:mysql -h host -u user -p dbname
    • 检查端口连通性:telnet host port
    • 验证SSL证书:openssl s_client -connect host:port
  • 参考文件:
    • 入口与异常处理:index.php
    • 引导与初始化:bootstrap.php
    • 调试异常渲染:SiteDebugExceptionRenderer.php
    • 安全策略:security.php
    • 系统常量:system.php
    • 数据库配置:config.php
添加日期:2026-10-05