PHP项目配置如何区分环境变量

wen PHP项目 31

本文目录导读:

PHP项目配置如何区分环境变量

  1. 使用 .env 文件(推荐)
  2. 服务器环境变量
  3. 根据主机名区分
  4. 配置文件数组方式
  5. 使用框架内置机制
  6. 环境变量示例表
  7. 安全建议
  8. 最佳实践

在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;
}

最佳实践

  1. 永远不要将 .env 文件提交到 Git
  2. 使用 .env.example 作为模板
  3. 敏感信息(数据库密码、API密钥)使用环境变量
  4. 不同环境使用不同的 .env 文件或环境变量
  5. 在部署时自动设置环境变量
  6. 始终提供合理的默认值

选择哪种方式取决于项目规模和团队习惯,中小型项目推荐使用 .env 文件方式,大型项目建议结合框架内置机制和服务器环境变量。

抱歉,评论功能暂时关闭!