本文目录导读:

- 核心方案:Prometheus + Pushgateway
- 推荐方案:PHP-FPM 直接暴露 /metrics 端点
- 基础设施级别:Nginx/Apache 指标 + PHP-FPM Exporter
- 告警配置
- 推荐工具组合
是的,PHP 监控告警完全可以且推荐使用 Prometheus。
虽然 PHP 传统上是“短生命周期”的脚本语言(请求结束进程就销毁),但现代 PHP 应用(特别是基于 PHP-FPM 的长驻进程)可以很好地与 Prometheus 集成。
以下是 PHP 使用 Prometheus 进行监控告警的几种主流方式及优缺点分析:
核心方案:Prometheus + Pushgateway
这是最常用、也最适合传统 PHP(如 Apache mod_php 或普通 CGI)的方式。
- 原理:PHP 脚本在处理请求时,将指标数据推送到一个中间组件 Pushgateway,Prometheus 再从 Pushgateway 拉取数据。
- 适用场景:无法暴露 HTTP /metrics 端点的传统 PHP 脚本、批处理任务、cron job。
- 优点:无需修改 PHP 运行模式,兼容性好。
- 缺点:Pushgateway 是单点(需高可用),指标数据有过期风险(需手动清理)。
- 实现:使用
prometheus/client_php库推送到 Pushgateway。
推荐方案:PHP-FPM 直接暴露 /metrics 端点
这是现代 PHP 应用(如 Laravel、Symfony、ThinkPHP)的最佳实践,推荐使用。
- 原理:PHP-FPM 是长驻进程池,可以启动一个持续的 HTTP 服务(通常配合 ReactPHP 或 Amp 异步框架),或者更简单地通过一个专门的 PHP 脚本来收集指标并输出。
- 适用场景:基于 PHP-FPM 的 Web 应用,且有能力集成路由(如使用 Laravel 路由)。
- 优点:
- 实时性高:Prometheus 直接拉取,数据延迟低。
- 无单点:每个 PHP-FPM 实例都可独立抓取。
- 自动清理:指标随进程生命周期自然消失,无残留。
- 缺点:需要框架支持或额外的异步插件。
- 实现:
- 库:推荐使用
promphp/prometheus_client_php(支持 FPM 模式)。 - 框架集成:有现成的包,如 Laravel 的
superbalist/laravel-prometheus-exporter、Symfony 的pixelfederation/prometheus-bundle。
- 库:推荐使用
基础设施级别:Nginx/Apache 指标 + PHP-FPM Exporter
如果你的 PHP 应用无法修改代码,可以从 Web 服务器层面监控。
- 原理:
- Nginx Exporter:监控 Nginx 自身状态(
stub_status),获取请求量、连接数、响应码等。 - PHP-FPM Exporter:监听 PHP-FPM 的
status页面(需开启pm.status_path),获取进程池状态(活跃进程、空闲进程、请求队列等)。
- Nginx Exporter:监控 Nginx 自身状态(
- 适用场景:不想改代码、只监控 PHP 进程本身健康状态。
- 优点:零代码侵入,部署简单。
- 缺点:无法监控应用层业务指标(如订单数、用户注册量)。
告警配置
无论采用哪种采集方式,告警逻辑都在 Prometheus Server 中集中配置。
# 示例告警规则:PHP-FPM 进程池接近满载
groups:
- name: php_alerts
rules:
- alert: PHPFpmHighActiveProcesses
expr: (phpfpm_active_processes / phpfpm_max_children) > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "PHP-FPM 活跃进程高 ({{ $value | humanizePercentage }})"
description: "实例 {{ $labels.instance }} 的 PHP-FPM 活跃进程已超过 80%。"
- alert: PHPFpmPoolFull
expr: phpfpm_active_processes == phpfpm_max_children
for: 1m
labels:
severity: critical
annotations:
summary: "PHP-FPM 进程池已满"
description: "PHP-FPM 正在拒绝新连接,请检查慢查询或攻击。"
推荐工具组合
| 层级 | 工具 | 说明 |
|---|---|---|
| 数据采集(代码层) | promphp/prometheus_client_php |
官方推荐 PHP 客户端库 |
| 数据采集(进程层) | hipages/php-fpm_exporter (Go) |
专门解析 PHP-FPM status 页面的 Exporter |
| 数据存储 & 计算 | Prometheus Server | 核心时序数据库与告警引擎 |
| 告警管理 | Alertmanager | 处理告警去重、分组、路由(发送短信、邮件、钉钉等) |
| 可视化 | Grafana | 数据展示、图表分析 |
| 替代方案(保留历史) | VictoriaMetrics / Thanos | 如果数据量巨大,可替代 Prometheus 的存储层 |
- 可以用:PHP 监控告警非常适合用 Prometheus。
- 最佳实践:对于 Web 应用,优先选择 PHP-FPM 直接暴露
/metrics端点(使用prometheus_client_php库集成到框架)。 - 快速上手:如果不想改代码,使用
php-fpm_exporter+ Nginx Exporter 可以快速搭建基础监控。 - 避坑提醒:避免对每个 HTTP 请求都直接暴露一个唯一的、高基数的标签(如
user_id),这会导致 Prometheus 性能严重下降。