PHP 項目中,數據庫連接信息(主機、用戶名、密碼)、API 密鑰等敏感配置常直接寫在代碼倉庫的配置文件中:
<?php
return [
'database' => [
'host' => '192.168.0.1',
'user' => 'administrator',
'password' => 'e1bfd762321e409cee4ac0b6e841963c',
],
];
當代碼需提交版本控制、進行代碼審查或第三方協作開發時,這些敏感信息極易洩露。
將敏感值從代碼中移除,改由運行環境注入。主流方案有三種:
fastcgi_param 注入在 Nginx 配置中定義環境變量:
fastcgi_param DATABASE_HOST 192.168.0.1;
fastcgi_param DATABASE_USER administrator;
fastcgi_param DATABASE_PASSWORD e1bfd762321e409cee4ac0b6e841963c;
PHP 代碼讀取 $_SERVER:
<?php
return [
'database' => [
'host' => $_SERVER['DATABASE_HOST'],
'user' => $_SERVER['DATABASE_USERNAME'],
'password' => $_SERVER['DATABASE_PASSWORD'],
],
];
缺點: 每次請求傳遞大量環境變量增加 FastCGI 通訊開銷;僅對 Web 請求生效,CLI 模式無效。
env 指令注入在 php-fpm.conf 主配置文件中設置(不能放在 include 的子配置文件中,否則報錯 Array are not allowed in the global section):
env[DATABASE_HOST] = 192.168.0.1
env[DATABASE_USERNAME] = administrator
env[DATABASE_PASSWORD] = e1bfd762321e409cee4ac0b6e841963c
PHP 同樣通過 $_SERVER 讀取(注意:雖用 env 設置,但實際在 $_SERVER 而非 $_ENV)。
優勢: 不增加 Nginx-PHP 通訊數據量;進程啟動時一次性注入。
hidef (鳥哥推薦)使用 hidef 擴展定義常量,編譯期常量,性能最高,且不佔用運行時內存:
; php.ini 或 hidef.ini
hidef.ini_path = /path/to/hidef.ini
; hidef.ini
DATABASE_HOST = "192.168.0.1"
DATABASE_USER = "administrator"
DATABASE_PASSWORD = "e1bfd762321e409cee4ac0b6e841963c"
PHP 代碼直接使用常量:
<?php
return [
'database' => [
'host' => DATABASE_HOST,
'user' => DATABASE_USER,
'password' => DATABASE_PASSWORD,
],
];
上述方案僅對 Web (FPM) 生效。CLI 腳本需額外處理:
<?php
// common/bootstrap.php
if (PHP_SAPI === 'cli') {
// 解析 Nginx 或 PHP-FPM 配置文件,提取環境變量映射到 $_SERVER
$config = parse_ini_file('/etc/php-fpm.d/www.conf'); // 或 nginx 配置
foreach (['DATABASE_HOST', 'DATABASE_USER', 'DATABASE_PASSWORD'] as $key) {
if (isset($config['env'][$key])) {
$_SERVER[$key] = $config['env'][$key];
}
}
}
phpinfo()phpinfo() 會暴露極其詳細的服務器信息:
生產環境必須:
phpinfo.php 文件php.ini 設置 disable_functions = phpinfo將敏感配置移至 Nginx/PHP-FPM 配置後,需嚴格控制這些配置文件權限:
root 可讀寫,www-data 僅讀| 方案 | 性能 | Web 支持 | CLI 支持 | 維護性 | 推薦場景 |
|---|---|---|---|---|---|
| Nginx fastcgi_param | 較差(每請求傳遞) | ✓ | ✗ | 一般 | 簡單項目、無 CLI 需求 |
| PHP-FPM env | 良好(啟動注入) | ✓ | 需額外腳本 | 良好 | 大多數生產環境 |
| hidef 擴展 | 最佳(編譯期常量) | ✓ | ✓ | 最佳 | 高性能、安全要求高項目 |
600 root:rootphpinfo()、var_dump() 等調試函數