PHP 数据库连接与环境变量管理

9次阅读

推荐用环境变量管理数据库配置,因其可避免凭据硬编码导致的泄露风险,实现配置与代码分离,便于多环境切换并符合 12-factor app 原则;开发用 phpdotenv 加载。env 文件,生产由服务器或 docker 注入环境变量,php 通过 getenv()或 $_env 读取,再构建 pdo 连接并启用异常模式确保安全。

PHP 数据库连接与环境变量管理

PHP 连接数据库时,把数据库配置(如主机、用户名、密码)硬编码在代码里是不安全也不灵活的做法。推荐用 环境变量 管理敏感配置,再通过 PHP 读取并建立连接。

为什么用环境变量管理数据库配置

把数据库凭据写死在代码中,容易意外提交到 Git、被日志打印、或在错误页面暴露。环境变量将配置与代码分离,便于多环境(开发 / 测试 / 生产)切换,也符合 12-Factor App 原则。

  • 开发环境用 .env 文件本地加载,生产环境由服务器(如 Nginx/Apache)或容器(如 Docker)注入系统级环境变量
  • PHP 通过 $_ENVgetenv() 读取,无需修改代码即可切换数据库地址或账号
  • phpdotenv 是常用库,能安全加载 .env 文件(仅限非生产环境)

典型实践:使用 vlucas/phpdotenv(开发阶段)

安装后,在入口文件(如 index.phppublic/index.php)顶部加载:

require_once __DIR__.'/vendor/autoload.php'; $dotenv = DotenvDotenv::createImmutable(__DIR__); $dotenv->safeLoad(); // 自动加载 .env 文件,跳过已存在的环境变量

.env 文件内容示例:

立即学习PHP 免费学习笔记(深入)”;

DB_HOST=localhost DB_PORT=3306 DB_NAME=myapp DB_USER=root DB_PASS=secret123

之后可用 getenv('DB_HOST')$_ENV['DB_HOST'] 获取值。

建立 PDO 连接(带错误处理)

用读取到的环境变量创建 PDO 实例,启用异常模式便于统一处理错误:

$host = getenv('DB_HOST') ?: 'localhost'; $port = getenv('DB_PORT') ?: '3306'; $dbname = getenv('DB_NAME') ?: 'test'; $user = getenv('DB_USER') ?: 'root'; $pass = getenv('DB_PASS') ?: '';  try {$dsn = "mysql:host={$host};port={$port};dbname={$dbname};charset=utf8mb4";     $pdo = new PDO($dsn, $user, $pass, [         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,         PDO::ATTR_EMULATE_PREPARES => false,]); } catch (PDOException $e) {error_log('Database connection failed: '. $e->getMessage());     throw new RuntimeException('Service unavailable', 503); }

注意:生产环境应禁用 .env 加载,改由 Web 服务器或运行时注入环境变量(例如 Docker 的 -e DB_HOST=……),避免文件被意外访问。

安全提醒与检查点

  • .env 文件必须加入 .gitignore,禁止提交到版本库
  • Web 根目录不能被直接浏览,确保 .env 不可通过 HTTP 下载(Apache/Nginx 需配置禁止访问 .env
  • 避免在错误响应中输出数据库密码等敏感信息,PDO::ATTR_ERRMODE 设为 EXCEPTION 后自行捕获并记录,不直接抛出给前端
  • 生产环境建议使用更严格的权限控制:数据库用户仅授予必要表的 SELECT/INSERT/UPDATE 权限,禁用 DROPFILE

text=ZqhQzanResources