PHP监控核心是分层精准埋点:Web层看请求与进程、应用层看指标与错误、系统层看资源与存活;盲目堆砌工具反增故障面,有效监控需“够用、可定位、不误报”。
PHP主流架构的运行状态监控,核心不是“装一堆工具”,而是按架构分层精准埋点:Web 层看请求与进程、应用层看指标与错误、系统层看资源与存活。盲目堆砌 New Relic + Prometheus + Zabbix 反而增加故障面,真正有效的监控是“够用、可定位、不误报”。
pm.status_path(如 /status),并在 Nginx/Apache 中配置安全访问(限制 IP 或加 auth_basic)curl "https://www./link/075b71ebbee1f5ca0675bdddbedebf37" 能拿到实时字段:active processes、max active processes、slow requests、accepted conn
active processes / max children > 0.8 → 需扩容或查阻塞slow requests 持续增长 → 立即查 slowlog 文件(路径由 slowlog 配置项指定)listen queue len > 0(需开启 pm.status_path 的详细模式)→ 表示请求已在队列排队,FPM 已过载location /status {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
allow 127.0.0.1;
deny all;
}prometheus/client_php 库时,/metrics 接口必须是 无认证、无重定向、无中间件拦截 的纯响应(否则 Prometheus 抓取失败)http_requests_total{method="GET",code="200"}(Counter)http_request_duration_seconds_bucket{le="0.1"} (Histogram,用于算 P95/P99)php_memory_usage_bytes(Gauge,用 memory_get_usage(true) 上报)/health 返回 200 ≠ 服务健康。数据库连不上、Redis 超时、下游 HTTP 接口不可达,这些都会让服务“半死”。
/health 接口必须做依赖探活,例如:SELECT 1)redis->ping()(带超时,如 200ms)curl_setopt($ch, CURLOPT_NOBODY, true
))up{job="my-service"} 只反映端口可达性,真正可用性得靠你自己的 service_health_status{dependency="mysql"} 0 or 1 这类业务指标/health 里查大表、调重接口 —— 它本身不该成为性能瓶颈microtime(true) 和日志能解决简单问题,但一旦出现「某个请求慢,但看不出哪一行慢」「并发下内存泄漏难复现」「跨服务调用链断裂」,就必须上 APM。
ddtrace 在 Swoole 协程环境下需额外配置 ddtrace.request_init_hook,否则 span 会丢失真正容易被忽略的是:监控数据本身的质量。比如把 error_log 写到磁盘但没轮转,半年后日志文件占满根分区;或者 Prometheus 抓取间隔设成 15s,却用它查“某次具体慢请求”的堆栈 —— 它根本不是为单请求设计的。监控不是越多越好,而是每条数据都得有明确用途和处置路径。