最直接有效的方式是在VirtualHost块内用SetEnv指令设置环境变量,仅对该站点生效;PHP中必须用getenv()读取,PHP-FPM下需改用pool配置env[]。

最直接有效的方式是在虚拟主机配置块(<VirtualHost>)内使用 SetEnv 指令。它专为单站点环境隔离设计,不污染其他站点,也不依赖外部机制。
在 VirtualHost 块中设置变量
编辑对应站点的配置文件(如 /etc/apache2/sites-available/example.com.conf),在 <VirtualHost *:80> 或 <VirtualHost *:443> 内添加:
SetEnv APP_ENV productionSetEnv DB_HOST 10.0.2.5SetEnv CACHE_DRIVER redis
这些变量仅对该域名生效,重启 Apache 后即可用。
确保 PHP 能正确读取
Apache 注入的变量不会自动进入 $_ENV,必须用 getenv() 获取:
- ✅ 推荐:
getenv('APP_ENV')—— 返回false表示未设置,最可靠 - ⚠️ 可用但有风险:
$_SERVER['APP_ENV']—— 可能与 Apache 自带变量名冲突(如SERVER_NAME) - ❌ 不推荐:
$_ENV['APP_ENV']—— 默认不可用,需修改php.ini中variables_order并包含E
入口文件中建议统一转为常量:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<?php
define('APP_ENV', getenv('APP_ENV') ?: 'local');
if (APP_ENV === 'production') {
ini_set('display_errors', '0');
}
避开常见失效场景
以下情况会导致 SetEnv 看似“没起作用”:
- 写在
.htaccess中但未开启AllowOverride All,或mod_env未启用 - 用在 PHP-FPM 环境下却误以为它会传给 FPM 子进程 —— 实际上 FPM 是独立守护进程,
SetEnv对其无效 - 在 CLI 模式运行脚本(如
php index.php)—— 此时完全不经过 Apache,变量自然不存在
PHP-FPM 场景应改用 pool 配置:env[APP_ENV] = production(写在 /etc/php/*/fpm/pool.d/www.conf 的对应 pool 段里)。
验证是否生效
临时加一段调试代码到 PHP 入口:
<?php
var_dump(getenv('APP_ENV'));
// 输出 string(10) "production" 或 bool(false)
同时检查 Apache 配置语法:sudo apache2ctl -t,无报错再重启:sudo systemctl restart apache2。

















