disable_functions必须在php.ini中手动配置且不可运行时修改;需确认生效路径、全小写无空格逗号分隔、禁用高危函数并重启服务,cli与web配置须分别处理。

disable_functions 在 PHP 7.2 中必须手动写入 php.ini,运行时无法修改,且配置错误会导致整行失效——比如多一个空格、换行或大写字母,就等于没禁。
确认并编辑正确的 php.ini 文件
PHP 7.2 的配置文件路径因安装方式而异,常见位置包括:
-
/etc/php/7.2/apache2/php.ini(Apache + mod_php) -
/etc/php/7.2/fpm/php.ini(Nginx + PHP-FPM) -
/usr/local/php/etc/php.ini(源码编译)
别猜,直接执行:php --ini 查看 “Loaded Configuration File”,或在 Web 环境中用 <?php phpinfo(); ?> 找到真实生效的路径。改错文件,重启也没用。
写对 disable_functions 这一行
在 php.ini 中找到或新增这一行,**必须严格满足以下条件**:
- 函数名全小写,英文逗号分隔,**逗号后不能有空格**(
exec,system,passthru✅,exec, system❌) - 整行不能换行,否则 PHP 只解析第一行,后面全丢
- 不能用引号包裹,不能加
#注释在同一行 - 推荐基础高危函数列表:
exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,dl
示例正确写法:disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,dl
别忘了 CLI 模式也得配
PHP 7.2 的 CLI(命令行)用的是另一套配置,php -v 或 composer install 报 proc_open is disabled,说明你只改了 Web 版本的 php.ini,没动 php-cli.ini。
- CLI 配置文件路径通常是:
/etc/php/7.2/cli/php.ini或/usr/local/php/etc/php-cli.ini - 同样搜索
disable_functions =,按相同规则修改 - 验证 CLI 是否生效:
php -r "var_dump(function_exists('proc_open'));"输出bool(false)才算成功
重启服务并验证是否真生效
改完两个 php.ini 后,必须重启对应服务:
- Apache:
sudo systemctl restart apache2 - PHP-FPM:
sudo systemctl restart php7.2-fpm - Nginx 本身不用重启,但要确保 PHP-FPM 已重载
验证方式不止看 phpinfo() 页面里的 disable_functions 值,更可靠的是实测:
- 新建
test.php:<?php echo exec('id'); ?>—— 应返回空或报E_WARNING: Function exec is disabled - 终端执行:
php -r "echo ini_get('disable_functions');"—— 输出应和你写的完全一致
最容易被忽略的一点:宝塔等面板的“禁用函数”界面只是追加,不是覆盖;如果你用面板,必须手动进文件删掉旧值再重写整行,否则 putenv、proc_open 这类常被硬编码进模板的函数永远删不干净。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











