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