Linux下ThinkPHP如何监控
小樊
42
2026-01-03 00:25:46
Linux下ThinkPHP监控实践
一 监控目标与分层
- 基础设施层:CPU、内存、磁盘IO、网络、连接数(如 Nginx/php-fpm 进程与队列)。
- 应用层:请求量、响应时间、错误率、慢查询、队列积压、缓存命中率。
- 业务层:关键接口成功率、核心任务执行结果、SLA 达成率。
- 日志与链路:统一日志、异常告警、分布式追踪(可选)。
二 快速落地方案
- 日志与性能中间件
- 在 TP5/TP6 中新增中间件,记录请求开始/结束时间、状态码、URL、耗时,并将慢请求与错误写入日志;开发环境可开启 调试面板 辅助排查。示例中间件(TP5/TP6通用思路):
- 代码示例:
- 创建中间件 PerformanceLogger.php
- 记录 $startTime、执行 $next($request)、计算 $duration,按阈值记录“慢请求”
- 配置中间件到全局或分组
- 用途:快速获得 RT、错误率、慢查询 基线,便于接入 Grafana Loki/Promtail 做可视化与告警。
- 外部APM与指标上报
- 使用 Datadog 的 DogStatsD 上报自定义指标(如接口耗时、队列长度),在 Linux 上部署 DataDog Agent 监听 8125/udp,代码中通过 Composer 引入 php-datadogstatsd 并打点。
- 代码示例:
- composer require datadog/php-datadogstatsd
- 配置 host/port/namespace/tags
- 在控制器/服务中记录 timing/histogram/counter
- 用途:与 Datadog 可视化、告警联动,适合生产环境持续观测。
- 队列与常驻任务守护
- 使用 Supervisor 管理 think-queue:work 等常驻进程,异常自动重启、日志集中、状态可查。
- 关键配置:command 使用 绝对路径 的 PHP 与项目入口;设置 autostart/autorestart、stdout/stderr 日志;变更用 update 而非 reload 减少抖动。
- 用途:保障 异步任务/队列 稳定运行,异常退出自动拉起,便于监控进程存活与重启次数。
- 定时巡检与健康检查
- 使用 Linux Cron 定时调用项目的健康检查或关键任务,通过 HTTP 客户端 请求应用内健康检查接口(避免直接以 CLI 方式运行框架脚本导致路径/环境不一致)。
- 示例:cron.php 中使用 HttpClient 请求 /health 或关键业务端点,根据返回码与内容判断告警。
- 用途:实现 存活探测、数据一致性校验、批处理监控 等轻量巡检。
三 建议的指标与告警规则
- 基础设施
- CPU利用率 > 80% 持续 5 分钟
- 内存使用率 > 80% 或 OOM 事件
- 磁盘可用空间 < 10%
- php-fpm 进程异常退出/重启次数异常
- 应用
- 5xx 错误率 > 1%(按服务/接口维度)
- P95/P99 响应时间 > 设定阈值(如 1s/2s)
- 慢请求数/分钟 > 阈值(如 > 10)
- 数据库连接失败/超时次数
- 队列
- 队列积压量持续增长(对比 5 分钟 均值)
- 任务失败率上升
- worker 进程数低于预期
- 业务
- 关键接口成功率 < 99%
- 核心定时任务连续 2 次 执行失败
四 部署与运维要点
- 仅在生产关闭 app_debug,避免泄露敏感信息;日志级别与保留策略按合规配置。
- 统一日志格式(如 JSON),便于 Loki/ELK 解析;为关键指标建立 Dashboard 与 阈值告警。
- 所有路径、命令使用 绝对路径;Supervisor 与 Cron 的环境变量、工作目录要与 Web 一致。
- 区分开发/预发/生产 命名空间与标签(如 env:prod),避免指标混淆。
- 变更发布后,优先观察 错误率、RT、队列积压 的黄金指标,确认无异常再扩大流量。