putenv不支持(PHP,宝塔/虚拟主机常见,一般是disable_functions禁用,你做易支付/当面付源码遇到的)
报错:putenv() has been disabled for security reasons
方案1:宝塔面板(最简单推荐)
- 软件商店 → 找到你网站用的PHP版本(如PHP7.4)→【设置】
- 找到 禁用函数,在列表里找到
putenv,点删除 - 保存 → 重启PHP
- 刷新网站,报错消失
部分源码(dotenv/.env环境配置)同时需要放开:
proc_open
方案2:直接改php.ini(无面板服务器)
打开php.ini,搜索
disable_functions = ...,putenv,...删掉 putenv, 这一段,保存,重启php-fpm
方案3:虚拟主机不允许改禁用函数(无法开启putenv,必须改源码兼容)
很多低价虚拟主机不让修改disable_functions,不能启用putenv。
这类源码一般是用 vlucas/phpdotenv 读取.env配置文件(易支付源码常用)。
重写putenv兼容代码(在项目入口最顶部加入)
// 模拟putenv,函数被禁用时代码不报错
if (!function_exists('putenv')) {
function putenv($setting) {
// 拆分环境变量
if(strpos($setting,'=')!==false){
list($k,$v)=explode('=',$setting,2);
$_ENV[$k]=$v;
$_SERVER[$k]=$v;
}
return true;
}
}原理:源码里读取配置用 getenv(),我们手动写到$_ENV,绕过putenv。
⚠️限制:如果程序需要调用shell子进程并把环境变量传给命令行,这个模拟方案无效;仅适合网站PHP内部读取.env配置(90%易支付源码够用)
方案4:Nginx/Apache预注入环境变量(不修改PHP代码)
Nginx配置添加:
fastcgi_param ENV_NAME "value";Apache:
SetEnv ENV_NAME value直接在web服务器层面注入环境变量,不用php putenv。
常见坑
- 修改完PHP必须重启PHP-FPM,只重启nginx无效
- 确认网站使用的PHP版本!多个PHP共存时,改了别的版本没用
- 云主机安全防护、防火墙/云盾也可能拦截putenv
你是宝塔服务器,还是虚拟主机?我直接给你对应操作。
