直接改disable_functions配置是唯一可靠解法;必须定位真实php.ini路径(用php_ini_loaded_file()或php --ini确认),删除目标函数并确保逗号分隔无空格,重启对应服务(Apache/FPM),同时排查.htaccess、FPM pool、Suhosin等更高优先级覆盖配置,最后用function_exists()验证Web环境生效。

直接改 disable_functions 配置是唯一可靠、可预期的解法;其他“绕过”手段要么依赖特定扩展/环境,要么高风险、不稳定,生产环境不建议碰。
确认当前生效的 php.ini 路径
别猜,先定位真实配置文件。在 PHP 文件里写:
<?php echo php_ini_loaded_file(); ?>
或者终端执行:php --ini。输出中的 Loaded Configuration File 行才是你要改的那个文件。宝塔用户注意:PHP 8.4 的配置通常在 /www/server/php/84/etc/php.ini,不是 /etc/php/84/ 下的路径。
编辑 disable_functions 行并重启服务
打开上一步确认的 php.ini,搜索 disable_functions。常见错误操作包括:
立即学习“PHP免费学习笔记(深入)”;
- 删掉函数名但留下多余逗号,比如把
exec,system,phpinfo改成exec,system,—— 这会导致最后那个空项被当成函数名,PHP 启动失败 - 只改了 CLI 模式的
php.ini(如/etc/php/84/cli/php.ini),但 Web 请求走的是 FPM 模式,实际生效的是另一个文件 - 改完没重启对应服务:Apache 用户要
systemctl restart apache2,PHP-FPM 用户必须systemctl reload php84-fpm(注意版本号匹配)
正确做法是:整行删除目标函数(如 phpinfo 或 shell_exec),确保前后无空格,逗号分隔干净,保存后立刻验证。
检查更高优先级的覆盖配置
php.ini 不一定最终生效。以下位置的设置会覆盖它,且无需重启 PHP 就可能即时生效:
- Apache 的
.htaccess或虚拟主机配置中含php_flag disable_functions或php_admin_value disable_functions—— 搜索整个网站目录和/etc/apache2/sites-enabled/ - PHP-FPM pool 配置(如
/etc/php/84/fpm/pool.d/www.conf)里的php_admin_value[disable_functions]—— 这个优先级最高,php.ini的修改会被它完全无视 - Suhosin 扩展独立配置(
suhosin.executor.func.blacklist)—— 即使php.ini没禁phpinfo,Suhosin 也能把它拦住
查 Suhosin 是否启用:php -m | grep suhosin;若存在,去 /etc/php/84/mods-available/suhosin.ini 里找黑名单项。
验证是否真生效
别信“改完就通”。用最简代码验证:
<?php var_dump(function_exists('phpinfo')); ?>
返回 bool(true) 才算成功。如果还是 false,说明有某处配置没清干净,重点复查 FPM pool 和 Suhosin。另外注意:CLI 和 Web 环境的 disable_functions 是分开控制的,php -r "var_dump(function_exists('shell_exec'));" 只能验证命令行,不能代表网页请求。
真正麻烦的点往往不在怎么删,而在删完之后——哪个配置层偷偷又把它加回来了。尤其是多 PHP 版本共存、或用了宝塔/AMH 这类面板时,php.ini 可能被自动覆盖,得盯住配置同步机制。



















