PHP探针调用phpinfo()失败主因是disable_functions禁用该函数;可通过test.php验证、ini_get('disable_functions')检查,修改php.ini或控制台配置启用,或用PHP_VERSION等原生函数替代。

PHP探针调用 phpinfo() 失败的常见原因
PHP探针不显示 phpinfo(),绝大多数情况不是探针写错了,而是服务器环境主动禁用了该函数。PHP 官方早就在默认安全策略中将 phpinfo() 列入高危函数,很多主机商或运维会在 php.ini 的 disable_functions 里直接禁用它。
你可以通过以下方式快速验证:
- 新建一个
test.php,内容为 -
浏览器访问该文件,如果返回空白页或 500 错误,且错误日志里出现
Call to undefined function phpinfo(),就坐实了被禁用 - 用
var_dump(ini_get('disable_functions'));查看实际禁用列表
如何确认 disable_functions 是否禁用了 phpinfo
在探针脚本里加一段诊断代码,比盲猜更可靠:
phpinfo() 被 disable_functions 禁用';
} else {
phpinfo();
}
?>
注意:ini_get('disable_functions') 返回的是逗号分隔字符串,需拆解后精确匹配 'phpinfo'(不含括号),否则容易误判。
立即学习“PHP免费学习笔记(深入)”;
常见陷阱:
- 某些环境把
phpinfo写成phpinfo,(末尾带逗号),in_array仍能匹配,但若用strpos就可能漏掉 -
disable_functions可能跨多行配置,但ini_get只返回最终合并后的值,无需额外处理换行
绕过禁用?别试了,改配置才是正路
试图用反射、eval 或 create_function 重实现 phpinfo() 基本无效——只要 disable_functions 里有 phpinfo,所有变体调用都会被拦截;而且现代 PHP(7.4+)已废弃 create_function,eval 本身也常被禁。
真正可行的路径只有两条:
- 如果你有服务器 root 权限:编辑
/etc/php/*/apache2/php.ini或/etc/php/*/cli/php.ini,从disable_functions行删掉phpinfo,然后重启php-fpm或 Apache - 如果你用的是虚拟主机或云平台(如阿里云轻量、腾讯云CVM面板):进控制台找「PHP 配置管理」或「函数禁用设置」,勾选/取消
phpinfo,保存后生效(部分平台需手动重启 PHP 进程)
切记:修改后务必用 php -m 或 php --ini 确认加载的是你改的那个 php.ini,而不是别的路径下的配置文件。
替代方案:不用 phpinfo() 也能拿到关键信息
如果实在无法启用 phpinfo()(比如共享主机明确禁止),可以用原生函数拼凑核心信息:
PHP 版本' . PHP_VERSION . '
'; echo 'SAPI
' . PHP_SAPI . '
'; echo '扩展列表
' . print_r(get_loaded_extensions(), true) . ''; echo '内存限制
' . ini_get('memory_limit') . '
'; echo '上传限制
' . ini_get('upload_max_filesize') . '
'; ?>这些函数(
PHP_VERSION、get_loaded_extensions()、ini_get())极少被禁用,覆盖了探针最常查的 80% 信息。但注意:ini_get_all()有时也会被禁,不如逐个查关键项稳妥。真实运维中,最常被忽略的是:探针页面本身用了
ob_start()或输出缓冲,而phpinfo()输出是原始 HTML,混用时容易导致格式错乱甚至白屏——遇到这种情况,先注释掉缓冲相关代码再测试。











