phpenv 不提供监控能力,仅管理 PHP CLI 版本;Prometheus 监控需依赖 php-fpm 的 status 接口和 php-fpm-exporter 采集,且 opcache 等指标需额外手动集成并注意多进程下的状态局限性。

phpenv 本身不提供监控能力,它只是 PHP 版本管理工具;想用 Prometheus 监控 PHP 环境,得靠外部组件配合,核心是让 PHP(尤其是 php-fpm)暴露指标,再由 Prometheus 抓取。
phpenv 安装后,PHP 版本切换不影响 Prometheus 监控
phpenv 控制的是 php 命令和 CLI 环境的 PHP 版本,而 Web 服务(如 Nginx + php-fpm)通常使用独立的 php-fpm 进程池,其版本由 php-fpm 二进制路径和配置决定。两者解耦:
- 你用
phpenv global 8.1.25切换 CLI 版本,不影响正在运行的 php-fpm 7.4 进程 - php-fpm 的 status 接口、opcache 指标、进程状态等,只取决于它自身启动时加载的 PHP 配置和扩展
- 因此,Prometheus 监控目标应指向 php-fpm 实例(如
http://127.0.0.1:9010/status),而非 phpenv 管理的某个 CLI 版本
必须启用 php-fpm status 接口才能被 php-fpm-exporter 采集
这是整个链路的前提。若 status 接口未开,php-fpm-exporter 启动后会报错 failed to fetch metrics: Get "http://.../status": dial tcp ...:9010: connect: connection refused 或返回 404/403。
操作要点:
- 确认 php-fpm 配置文件(如
/etc/php/8.1/fpm/pool.d/www.conf)中已设置:pm.status_path = /status和ping.path = /ping - Nginx 需显式代理该路径,且仅允许本地或监控网段访问(避免暴露敏感信息):
location ~ ^/(status|ping)$ { allow 127.0.0.1; deny all; fastcgi_pass 127.0.0.1:9000; ... } - 重启 php-fpm 和 Nginx 后,手动
curl http://127.0.0.1:9010/status必须返回 pool、processes、start since 等字段
php-fpm-exporter 启动时需严格匹配 status 接口地址和端口
php-fpm-exporter 不解析 Nginx 配置,它直接 HTTP GET 你指定的 --endpoint。常见错误包括:
- 写成
--endpoint http://localhost/status→ DNS 解析失败或超时(建议用127.0.0.1) - 端口填错:Nginx 监听
9010,却写成--endpoint http://127.0.0.1:9000/status(那是 php-fpm 的 FastCGI 端口,不是 HTTP 接口) - 路径遗漏
/status:写成--endpoint http://127.0.0.1:9010→ 返回 404,exporter 日志里显示 empty response - SELinux 或防火墙拦截:即使本地 curl 成功,exporter 容器或非 root 用户可能被策略阻断
验证方式:curl -v http://127.0.0.1:9190/metrics(exporter 默认暴露端口)应返回以 # HELP php_fpm_ 开头的指标文本。
opcache 和自定义指标需额外集成,不能靠 php-fpm-exporter 自动获取
php-fpm-exporter 只采集 php-fpm 进程层指标(活跃进程数、请求数、慢请求、内存池等),不读取 PHP 内部状态(如 opcache hit rate、脚本编译失败次数)。要监控这些:
- 必须在 php.ini 中启用
extension=opcache并设opcache.enable=1、opcache.enable_cli=0(CLI 不需要) - 通过
opcache_get_status()手动导出为 Prometheus 格式,例如在metrics.php中调用并注册Gauge类型指标 - 若用
prometheus/client_php库,注意它默认不自动收集 opcache —— 你得自己写逻辑轮询并更新指标值 - 这类脚本必须部署在 Web 可访问路径(如
/metrics),且确保执行用户有权限读取 opcache 状态(通常需要opcache.restrict_api=""或设为空白)
真正容易被忽略的是:opcache 状态只对当前 PHP 进程有效,而 php-fpm 是多进程模型。你在某个 worker 中调用 opcache_get_status(),得到的是那个 worker 的缓存视图,不是全局聚合结果 —— 这意味着你需要设计合理的采样或汇总策略,而不是简单暴露单次调用值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











