phpEnv中修改disable_functions必须手动编辑对应PHP版本的php.ini文件,不可通过面板操作;需确保路径正确、格式严格(小写、无空格、单行逗号分隔),并重启服务后用phpinfo()验证生效。

phpEnv里改disable_functions必须编辑php.ini,不能用面板点选
phpEnv 是 Windows 下的便携式 PHP 环境套件(类似 XAMPP 但更轻量),它不提供 Web 面板或图形界面来配置 disable_functions。所有修改都得手动进配置文件,否则改了等于没改。
常见错误是以为在 phpEnv 的“服务管理”或“PHP 设置”页里点几下就能生效——其实那些页面只控制服务启停、PHP 版本切换,disable_functions 这种底层 ini 指令根本不在其管辖范围。
- 找到真实生效的
php.ini:默认路径是phpEnv\php\php-xx.x.x\php.ini(xx.x.x 为版本号,如 8.2.12) - 确认不是
php.ini-development或php.ini-production:这两个只是模板,phpEnv 启动时只读取名为php.ini的那个文件 - 改完后必须重启 phpEnv 的 Apache/Nginx 服务,且要验证是否加载成功:访问一个含
phpinfo()的页面,搜索disable_functions查看值是否是你填的内容
disable_functions = exec,system,passthru 写法错一个字符就全失效
phpEnv 使用的标准 PHP 解析器,对 disable_functions 值的格式极其敏感。写错空格、大小写、换行,都会导致整个配置被忽略——现象就是 phpinfo() 里显示为空,或者只禁了第一个函数。
- ✅ 正确写法:
disable_functions = exec,system,passthru,shell_exec,proc_open(纯英文逗号,无空格,全小写,单行) - ❌ 错误写法:
disable_functions = exec , system , passthru(逗号后有空格 → 只禁exec) - ❌ 错误写法:
disable_functions = EXEC,SYSstem(大小写混用 → 全部不识别) - ❌ 错误写法:多行写、带注释如
disable_functions = exec,\ # 执行命令\nsystem(换行或注释符会截断解析)
该禁哪些函数?别照抄网上“全禁列表”
phpEnv 多用于本地开发或测试环境,盲目照搬生产环境的超长禁用列表(比如把 unserialize、assert 也加进去),大概率导致 Composer 安装失败、Laravel 启动报错、甚至 phpEnv 自身的扩展管理器崩溃。
立即学习“PHP免费学习笔记(深入)”;
- 真正该禁的(本地开发也建议加上):
exec、system、shell_exec、passthru、proc_open、popen、pcntl_exec(Windows 下pcntl_*不可用,但留着无害) - 可不碰的(禁了反而坏事):
unserialize(反序列化风险不在函数本身)、assert(PHP 7.2+ 已移除动态代码执行能力)、curl_exec(本地调试常需调第三方 API) - Windows 特殊注意:
dl在 PHP 8.0+ 已移除,phpEnv 若用的是 8.0+,写上也无效;若用 7.4,务必加上,否则可能被绕过
改完发现还能调 exec?先查三个地方
即使配置看起来完全正确,仍能调通 exec,说明禁用没生效。别急着重装 phpEnv,先快速定位问题点:
- 确认你改的是正在运行的 PHP 版本的
php.ini:phpEnv 可能同时装了多个 PHP 版本,php -i | findstr "Loaded Configuration File"能准确定位当前加载的 ini 文件路径 - 检查是否有其他 ini 文件覆盖:phpEnv 有时会在
php\php-xx.x.x\conf.d\下放额外的 .ini 文件,里面若有disable_functions =空值或更短列表,会覆盖主配置 - 确认没被代码层绕过:某些框架或脚本会用
ini_set('disable_functions', '')尝试重置(虽然实际无效),但更常见的是用proc_open绕过——所以proc_open必须出现在你的禁用列表里,不能漏
本地开发环境的安全水位和线上不同,disable_functions 不是越长越好,而是越准越好。最容易被忽略的其实是 proc_open 和 putenv:前者在 WebShell 中比 exec 更隐蔽,后者在旧版 PHP 中能配合 sendmail 触发命令执行——这两项在 phpEnv 的默认配置里几乎从不出现,但你手动加时,往往也忘了。



















