必须通过phpinfo()确认“Loaded Configuration File”路径,再编辑该文件中的disable_functions项(全小写、无空格、无换行),最后重启对应服务并用exec('whoami')实测生效。

直接删掉 disable_functions 配置里的 exec 就行,但必须确认你改的是 PHP 实际加载的那个 php.ini,否则改了也白改。
怎么找到真正生效的 php.ini 文件
PHP 可能读取多个配置文件,但只认一个“Loaded Configuration File”——这个路径才是你该编辑的:
- 新建
info.php,内容为<?php phpinfo(); ?>,放 Web 根目录(如C:\wamp64\www\或/var/www/html/) - 浏览器访问
http://localhost/info.php,搜索Loaded Configuration File - 记下那个绝对路径,用 Notepad++ 或 VS Code 打开它;别碰
php.ini-development或桌面随便拷的副本
修改 disable_functions 的零容错写法
这个配置项极其敏感,错一个字符就整行失效,且 PHP 不报错、不警告、静默丢弃:
-
exec必须全小写:exec✅,EXEC❌,Exec❌ - 逗号是唯一分隔符,前后**不能有空格**:
exec,system,passthru✅,exec, system❌(system变成" system",匹配失败) - 禁止换行、禁止末尾逗号:
exec,passthru,❌(值变为空字符串,等于没禁) - 如果原配置是
disable_functions = exec,system,shell_exec,只需删掉exec和它前后的逗号,变成disable_functions = system,shell_exec
改完必须重启对应服务,刷新页面无效
配置变更不会热加载,必须重启 PHP 进程管理器:
立即学习“PHP免费学习笔记(深入)”;
- WAMP/XAMPP:点托盘图标 → “Restart All Services” 或单独重启 Apache
- Linux + PHP-FPM:
sudo systemctl restart php7.0-fpm(注意版本号要对) - Linux + Apache 模块:
sudo systemctl restart apache2 - 改完后再次访问
info.php,确认disable_functions行显示的新值里确实没有exec
验证 exec 是否真可用(别信 phpinfo 一眼判断)
phpinfo() 显示的 disable_functions 值只是配置快照,不代表函数一定能调用。必须实测:
- 写个测试脚本:
<?php var_dump(exec('whoami', $out, $code)); print_r($out); echo "code: $code"; ?> - 如果返回
false且$code为 -1 或空,说明仍被禁;若输出用户名和code: 0,才算真正生效 - 注意 Windows 下
exec('whoami')实际调用的是cmd.exe /c whoami,确保系统环境变量正常
最容易被忽略的是:有些环境(比如宝塔面板或 Docker 容器)会通过 PHP-FPM 池级配置覆盖 php.ini,这时得去 /etc/php/7.0/fpm/pool.d/www.conf 里查 php_admin_value[disable_functions] ——那里写的才最终算数。



















