putenv 不支持(PHP,宝塔 / 虚拟主机常见,一般是disable_functions 禁用,你做易支付 / 当面付源码遇到的)

报错:putenv() has been disabled for security reasons

方案 1:宝塔面板(最简单推荐)

  1. 软件商店 → 找到你网站用的 PHP 版本(如 PHP7.4)→【设置】
  2. 找到 禁用函数,在列表里找到 putenv,点删除
  3. 保存 → 重启 PHP
  4. 刷新网站,报错消失博客园
部分源码(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。

常见坑

  1. 修改完 PHP 必须重启 PHP-FPM,只重启 nginx 无效
  2. 确认网站使用的 PHP 版本!多个 PHP 共存时,改了别的版本没用
  3. 云主机安全防护、防火墙 / 云盾也可能拦截 putenv