本文目录导读:

在PHP项目中区分环境变量,主要有以下几种常见方式:
使用 .env 文件(推荐)
安装依赖
composer require vlucas/phpdotenv
创建环境文件
.env(生产环境)
APP_ENV=production
DB_HOST=localhost
DB_NAME=production_db
DB_USER=admin
DEBUG=false
.env.development(开发环境)
APP_ENV=development
DB_HOST=localhost
DB_NAME=dev_db
DB_USER=root
DEBUG=true
加载配置
<?php
require_once __DIR__ . '/vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
// 根据服务器环境加载不同文件
$env = getenv('APP_ENV') ?: 'production';
$envFile = ".env.{$env}";
if (file_exists($envFile)) {
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__, $envFile);
$dotenv->load();
} else {
$dotenv->load();
}
服务器环境变量
Apache 配置
# .htaccess 或 httpd.conf SetEnv APP_ENV production SetEnv DB_HOST localhost SetEnv DB_NAME myapp_db
Nginx 配置
fastcgi_param APP_ENV production; fastcgi_param DB_HOST localhost;
PHP 获取
$env = $_SERVER['APP_ENV'] ?? 'production'; $dbHost = $_SERVER['DB_HOST'] ?? 'localhost';
根据主机名区分
<?php
class EnvironmentDetector {
public static function detect(): string {
$host = gethostname();
$environments = [
'dev-server' => 'development',
'test-server' => 'testing',
'prod-server' => 'production',
];
return $environments[$host] ?? 'production';
}
}
// 使用
$env = EnvironmentDetector::detect();
配置文件数组方式
config/environment.php
<?php
return [
'development' => [
'debug' => true,
'db' => [
'host' => 'localhost',
'name' => 'dev_db',
],
'log_level' => 'debug',
],
'production' => [
'debug' => false,
'db' => [
'host' => 'production-db.example.com',
'name' => 'prod_db',
],
'log_level' => 'error',
],
];
加载配置
<?php
$env = getenv('APP_ENV') ?: 'production';
$configPath = __DIR__ . "/config/environment.php";
$environments = require $configPath;
$config = $environments[$env] ?? $environments['production'];
使用框架内置机制
Laravel 示例
// .env 文件
APP_ENV=local
DB_CONNECTION=mysql
// 在代码中使用
$env = app()->environment();
if (app()->environment('local')) {
// 开发环境逻辑
}
Symfony 示例
// .env 文件 APP_ENV=dev // 在代码中使用 use Symfony\Component\Dotenv\Dotenv; $dotenv = new Dotenv(); $dotenv->load(__DIR__.'/.env'); $env = $_SERVER['APP_ENV'] ?? 'prod';
环境变量示例表
| 环境 | 文件 | 典型配置 |
|---|---|---|
| 开发 | .env.development |
调试开启,错误显示,使用本地数据库 |
| 测试 | .env.testing |
开启错误显示,使用测试数据库 |
| 预发布 | .env.staging |
错误不显示,使用预发布数据库 |
| 生产 | .env.production |
调试关闭,安全模式,使用生产数据库 |
安全建议
<?php
// 环境检测函数
function getEnvironment(): string {
// 优先级:环境变量 > 配置文件 > 默认值
$env = getenv('APP_ENV');
if (!$env && file_exists('.env')) {
$env = parse_ini_file('.env')['APP_ENV'] ?? 'production';
}
return $env ?: 'production';
}
// 获取配置
function getConfig(string $key, $default = null) {
$env = getEnvironment();
$configFile = __DIR__ . "/config/{$env}.php";
if (file_exists($configFile)) {
$config = require $configFile;
return $config[$key] ?? $default;
}
return $default;
}
最佳实践
- 永远不要将
.env文件提交到 Git - 使用
.env.example作为模板 - 敏感信息(数据库密码、API密钥)使用环境变量
- 不同环境使用不同的
.env文件或环境变量 - 在部署时自动设置环境变量
- 始终提供合理的默认值
选择哪种方式取决于项目规模和团队习惯,中小型项目推荐使用 .env 文件方式,大型项目建议结合框架内置机制和服务器环境变量。