要让ThinkPHP项目持续稳定运行,必须在6.0升级至8.0时同步打通监控链路:确认版本≥v8.0、安装think-swoole、配置分级日志、暴露/metrics接口、配置Prometheus告警规则并绑定邮件通知。

要让ThinkPHP项目在版本迭代过程中持续稳定运行,必须把监控告警能力嵌入到框架生命周期里——不是等上线后再补,而是从6.0升级到8.0时就同步打通日志通道、指标暴露和告警触发链路。
确认当前ThinkPHP版本与监控兼容性
执行 php think version 查看当前框架版本;若输出为 v6.1.0 或更低,说明尚未支持 PHP 8.0 原生协程与 OpenTelemetry 自动注入,【必须先升级到 v8.0+ 才能启用内置监控扩展】。
检查 composer.json 中 "topthink/framework" 的版本约束:若为 "^6.0",需手动修改为 "^8.0" 并运行 composer update topthink/framework。
升级后验证 vendor/topthink/think-swoole 是否存在——该包是 v8.0 实现 HTTP 指标自动采集的前提,缺失则监控数据无法上报。
立即学习“PHP免费学习笔记(深入)”;
启用 runtime 日志通道并配置分级告警
打开 config/log.php,将 'default' 通道的 'level' 改为 ['error', 'warning', 'sql'],避免 info 级日志淹没关键异常。
在 'channels' 数组中新增 'alert' 通道:
[ 'alert' => [ 'type' => 'file', 'path' => runtime_path() . 'log/alert/', 'level' => ['error', 'critical'], 'max_files' => 30 ] ]
这一步会让所有 Log::channel('alert')->error() 调用单独落盘,为后续日志轮询告警提供干净入口。
暴露 Prometheus Metrics 接口
方法一:使用官方扩展(推荐)
执行 composer require topthink/think-prometheus,安装后自动注册中间件 Think\Prometheus\Middleware\Metrics。
访问 /metrics 路径即可看到 http_requests_total{method="GET",status="200"} 等原生指标——【此接口默认仅允许 127.0.0.1 访问,生产环境需在 nginx 层做 IP 白名单限制】。
方法二:手动集成 client_php
执行 composer require prometheus/client_php,然后在 app/middleware/GlobalMiddleware.php 的 handle() 方法开头添加:
$registry = \Prometheus\CollectorRegistry::getDefault(); $counter = $registry->getOrRegisterCounter('http_requests_total', 'Total HTTP requests', ['method', 'status']); $counter->inc([$_SERVER['REQUEST_METHOD'], $response->getCode()]);
配置告警规则并绑定通知渠道
第一步:在 Alertmanager 配置文件中定义 PHP 服务专属路由
route: group_by: ['alertname', 'service'] receiver: php-alert receivers: - name: 'php-alert' email_configs: - to: 'ops@company.com' send_resolved: true
第二步:编写 Prometheus 规则文件 php_rules.yml
groups: - name: php-alerts rules: - alert: HighPHPErrorRate expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.03 for: 2m labels: severity: critical annotations: summary: "PHP 5xx 错误率超阈值" description: "{{ $value | humanize }}% 请求返回 5xx"
第三步:将规则文件挂载进 Prometheus 容器,并重启服务。
第四步:测试告警是否触发——用 curl -X POST http://localhost:8080/test-error 模拟错误接口,2分钟后检查邮箱是否收到告警邮件。



















