trae 是轻量级本地开发工具,自带 PHP 但不管理 disable_functions 配置;需手动修改其实际加载的 php.ini(如 C:\trae\php\php.ini),按规范设置 disable_functions 并重启服务方可生效。

trae 是什么,和 PHP disable_functions 有关系吗
trae 不是 PHP 官方组件,也不是 Apache/Nginx 的内置模块,它是一个独立的、轻量级的本地开发环境工具(类似 Laragon、XAMPP 的简化版),主打开箱即用。它自带 PHP,但不接管 PHP 配置文件的自动更新逻辑——也就是说,disable_functions 必须手动改它打包的 PHP 配置,trae 本身不提供图形界面或命令行开关来禁用函数。
常见误解是“trae 有 disable_functions_trae 这个配置项”,实际上并不存在这个 ini 指令,PHP 只认标准的 disable_functions。
找到 trae 真正使用的 php.ini 文件
trae 启动后用的是它自己目录下的 PHP,不是系统全局 PHP。必须定位到它实际加载的配置文件,否则改了也没用。方法如下:
- 在 trae 界面点击「PHP」→「phpinfo()」,打开页面后搜索
Loaded Configuration File,看到的路径就是真实生效的php.ini - 典型路径如:
C:\trae\php\php.ini或/Applications/trae.app/Contents/Resources/php/php.ini - 别直接改 trae 安装目录外的其他
php.ini(比如 WAMP 或 Homebrew 的),trae 不读那些
正确设置 disable_functions 并验证是否生效
编辑上一步找到的 php.ini,在 [Function Restrictions] 或任意靠前位置添加:
立即学习“PHP免费学习笔记(深入)”;
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec
注意要点:
- 函数名之间用英文逗号分隔,**不能有空格**(
exec, system❌,exec,system✅) - 大小写敏感:PHP 中函数名全小写,写成
EXEC或Shell_exec无效 - 修改后必须重启 trae 的 PHP 服务(在 trae 界面点「PHP」→「Restart」,不是只刷新网页)
- 验证方式:新建一个
test.php放在 trae 的 Web 根目录,内容为,访问后应返回空或报错Warning: shell_exec() has been disabled for security reasons
为什么有些函数禁不掉?常见漏网之鱼
单纯列在 disable_functions 里还不够,以下情况会导致禁用失效:
-
disable_functions对通过dl()动态加载的扩展函数无效(不过 PHP 8+ 已移除dl()) - 某些函数如
file_get_contents('php://filter')或include('data://text/plain,...')可绕过函数禁用,属于协议层问题,需配合allow_url_fopen = Off和allow_url_include = Off - 如果 trae 启用了多个 PHP 版本(如 PHP 7.4 / 8.2 切换),要确认你改的是当前启用版本的
php.ini,而不是其他版本的 - Windows 下部分函数(如
com_load)不在默认禁用列表中,需手动追加
真正起作用的永远是 PHP 解析器读到的那个 php.ini,而不是你“以为它该读”的那个。











