PHP 5.4.0起已彻底移除safe_mode,TRAe中所谓“PHP安全模式”实为disable_functions、open_basedir或沙箱限制;需检查PHP版本、禁用函数列表及TRAe三层防护机制并重启服务生效。
TRAe 是一个基于 Web 的 PHP 集成开发环境(类似小皮面板、宝塔的轻量版),但它的“PHP 安全模式”其实是用户对 safe_mode 的误称——PHP 自 5.4.0 起已彻底移除该特性,任何 TRAe 版本都不可能启用或关闭它。你实际遇到的,大概率是 disable_functions、open_basedir 或 TRAe 自带的沙箱限制。
PHP 源码里早没这玩意了。从 PHP 5.4.0 开始,safe_mode 被完全废弃并删除;5.4+ 编译时即使加 --enable-safe-mode 也无效。TRAe 若基于 PHP 7.x/8.x,配置文件里搜 safe_mode 必然为空。
php -v,若显示 7.2.34 或更高,直接放弃找这个参数php.ini 中残留的 safe_mode = Off 属于历史垃圾配置,删掉也不影响运行disable_functions(禁用函数列表)和 open_basedir(目录访问白名单)TRAe 的“安全限制”主要来自三处:PHP 配置、TRAe 后台界面开关、以及其内置的代理/沙箱层。需逐层排查:
exec、shell_exec、system、passthru —— 这些才是导致命令执行失败的真凶php.ini 中 open_basedir 值,如为 /www/wwwroot/:/tmp/,则 PHP 无法读写其他路径(比如 /home/user/)disable_functions 未设),此时需在 TRAe 设置中关闭「PHP 函数过滤」或「WebShell 防护」开关别靠猜,用最小代码实测:
如果输

exec 显示 bool(false),且 disable_functions 包含该函数名,那问题就定位清楚了——不是安全模式,是函数被明确禁用。
TRAe 不像 Apache 那样 reload 就生效,它常驻进程管理 PHP-FPM,改完 php.ini 后必须手动重启 PHP 服务:
trae php restart 或 systemctl restart trae-php(取决于安装方式)ps aux | grep php-fpm 查看启动时间是否为修改后/opt/trae/php/conf.d/user.ini,优先改这里而非主 php.ini
真正麻烦的不是关某个开关,而是 TRAe 把多层限制叠在一起:PHP 层禁函数、应用层做白名单、前端还加 JS 校验。遇到“明明开了却还是报错”,得一层层 phpinfo() 对比,看哪一层偷偷又拦了一道。