PHP探针数据缺失主因是底层配置限制:环境变量需Nginx显式传递且PHP-FPM禁用clear_env;shell函数被disable_functions屏蔽;/proc文件权限不足或系统兼容性导致。
PHP探针部分数据缺失,通常不是探针本身坏了,而是它依赖的底层信息被禁用、权限不足或配置拦截了——直接查 phpinfo() 输出对比就能定位到具体哪项“查不到”。
getenv() 和 $_SERVER 里看不到某些环境变量
常见于 Nginx + PHP-FPM 架构下,PHP 进程无法继承 Web 服务器启动时的环境变量。比如 PATH、HOME 或自定义变量(如 PHP_PROBE_ENV)默认不会透传。
fastcgi_param 传递,例如:fastcgi_param PHP_PROBE_ENV "prod";
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,
exec,所以得一并确认exec('whoami') 可能成功,但 exec('/bin/df') 失败——建议用绝对路径测试,并确认该路径在 open_basedir 白名单内这类数据依赖系统文件读取(如 /proc/meminfo、/proc/loadavg),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 看真实系统调用才看得清。