PHP探针数据缺失主因是底层配置限制:环境变量需Nginx显式传递且PHP-FPM禁用clear_env;shell函数被disable_functions屏蔽;/proc文件权限不足或系统兼容性导致。

PHP探针部分数据缺失,通常不是探针本身坏了,而是它依赖的底层信息被禁用、权限不足或配置拦截了——直接查 phpinfo() 输出对比就能定位到具体哪项“查不到”。
为什么 getenv() 和 $_SERVER 里看不到某些环境变量
常见于 Nginx + PHP-FPM 架构下,PHP 进程无法继承 Web 服务器启动时的环境变量。比如 PATH、HOME 或自定义变量(如 PHP_PROBE_ENV)默认不会透传。
- Nginx 配置中需显式用
fastcgi_param传递,例如:fastcgi_param PHP_PROBE_ENV "prod";
- PHP-FPM 的
www.conf中若设置了clear_env = yes(默认值),会清空所有父进程环境,设为no才保留基础变量 -
getenv('PATH')在 CLI 模式下可用,但 Web SAPI 下常返回false,应改用$_SERVER['PATH']或直接读phpinfo()的 “Environment” 区块
shell_exec()、exec() 返回空或报错:函数被禁用
探针里用来查磁盘空间、内存、系统时间的命令(如 df -h、free -m)全靠这些函数执行。一旦返回空字符串或 NULL,大概率是被 disable_functions 屏蔽了。
- 检查
php.ini中的disable_functions是否包含shell_exec,exec,passthru,system等 - 注意:即使只禁了
shell_exec,有些探针也会 fallback 到exec,所以得一并确认 - 部分主机商还会通过 Suhosin 或 open_basedir 限制命令执行路径,此时
exec('whoami')可能成功,但exec('/bin/df')失败——建议用绝对路径测试,并确认该路径在open_basedir白名单内
内存、CPU、负载等动态数据始终显示 0 或 N/A
这类数据依赖系统文件读取(如 /proc/meminfo、/proc/loadavg),PHP 进程没权限读就拿不到。
立即学习“PHP免费学习笔记(深入)”;
- 检查 PHP 运行用户(如
www-data或nginx)是否对/proc/下对应文件有读权限(通常有,但容器或加固系统可能限制) - 某些探针用
sys_getloadavg()获取负载,该函数在 Windows 下不可用,在旧版 PHP(function_exists('sys_getloadavg') 判断 - 内存计算逻辑易出错:探针常从
/proc/meminfo提取MemTotal:和MemFree:,但现代 Linux 还要算Buffers和Cached,否则“可用内存”严重偏低——这不是缺失,是算法偏差
真正难排查的是混合限制:比如 disable_functions 放开了 exec,但 open_basedir 锁死了根目录,导致 exec('cat /proc/uptime') 因找不到 /bin/cat 而失败;又或者 SELinux 启用后,PHP 进程被禁止访问 /proc。这类问题必须结合 error_log 和 strace 看真实系统调用才看得清。











