設定環境變數配置的簡單方法.env

lilongsy發表於2017-11-27

什麼是.env

.env檔案位於專案根目錄下,作為全域性環境配置檔案。

通過 .env檔案 載入環境變數並且能夠自動的通過 getenv(), $_ENV$_SERVER 自動呼叫.
這是一個PHP版本 Ruby dotenv.

示例

// 執行環境名稱
APP_ENV=local
// 除錯模式,開發階段啟用,上線狀態禁用。
APP_DEBUG=true
// 敏感資訊加密金鑰,可使用 php artisan key:generate 重新生成。
APP_KEY=
// 專案根目錄
APP_URL=http://localhost

// 快取驅動,預設使用檔案作為快取。
CACHE_DRIVER=file
// 回話驅動,預設使用檔案儲存SESSION。
SESSION_DRIVER=file
// 佇列驅動,預設使用同步模式。
QUEUE_DRIVER=sync

// Redis高效能key-value資料庫,使用記憶體儲存,用於資料持久化。
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

// 資料庫配置項
DB_HOST=127.0.0.1//資料庫主機名
DB_PORT=3306//資料庫埠
DB_DATABASE=homestead//資料庫名稱
DB_USERNAME=homestead//資料庫登入賬戶
DB_PASSWORD=secret//資料庫登入密碼

優勢

  • 把.env加入GIT的.gitignore檔案中,可以避免.env檔案中的敏感資訊洩露
  • 可以不用修改Apache/nginx配置檔案,就可以設定環境變數
  • 無需在.htaccess中新增 php_value 值
  • 方便移植和共享 ENV 環境變數值
  • 相容伺服器內建的伺服器和 CLI 執行器

使用 composer 安裝

curl -s http://getcomposer.org/installer | php
php composer.phar require vlucas/phpdotenv

使用方法

.env檔案通常不包含在版本控制內, 它可能包含敏感的 API Key 或者 密碼. 所有需要環境變數定義(不敏感的定義)的專案都需要建立一個.env.example檔案, 這個環境變數包含他們自己定義的環境變數或者聯合開發包含的環境變數. 專案合作開發者可以獨立的複製 .env.example 並且重新命名為 .env, 並且修改為正確的本地環境配置, 儲存密碼key或者提供他們必要的值. 在這個使用方法中.env檔案應該新增到.gitignore檔案中並且永遠不會被專案的合作者簽入/簽出. 這個方法確保裡邊沒有敏感的 API Key 或者 密碼在版本控制中出現從而減少了安全風險. 並且開發環境中的配置永遠不會告知合作開發者.

新增配置到根目錄下的.env檔案, 確保.env檔案新增到.gitignore從而不會簽入到 CVS

S3_BUCKET=dotenv
SECRET_KEY=souper_seekret_key

現在建立一個 .env.example 檔案, 並且簽入到專案中. 這裡配置和環境變數你需要設定的可以留空或者設定一些無關緊要的資料. 這個方法告知人們這些資料是必須的, 但是不會提供真正環境中的資料.

S3_BUCKET=devbucket
SECRET_KEY=abc123

你可以使用以下一行程式碼載入應用中的 .env 檔案:

Dotenv::load(__DIR__);

所有定義的變數都可以通過 getenv 方法訪問到, 並且也可以使用超全域性變數$_ENV$_SERVER訪問到.

$s3_bucket = getenv('S3_BUCKET');
$s3_bucket = $_ENV['S3_BUCKET'];
$s3_bucket = $_SERVER['S3_BUCKET'];

你同樣可以使用框架的 Request 類來訪問這些變數(如果你使用框架)

$s3_bucket = $request->env('S3_BUCKET');
$s3_bucket = $request->getEnv('S3_BUCKET');
$s3_bucket = $request->server->get('S3_BUCKET');

嵌入變數

在一個變數中嵌入一個環境變數是可以的, 這樣對於減少重複很有用.

使用 {$…} 來包裹環境變數 e.g.

BASE_DIR=/var/webroot/project-root
CACHE_DIR={$BASE_DIR}/cache
TMP_DIR={$BASE_DIR}/tmp

不可變

預設來說, Dotenv 認為環境變數是不變的. 這就是說一旦設定就不能變更.

你可以用以下函式將環境變數設定為可變的

Dotenv::makeMutable();

… 同樣你也可以使用以下函式讓其不再可變

Dotenv::makeImmutable();

要求變數必須設定

使用 Dotenv, 你可以指定這個 ENV 變數必須設定, 如沒有設定則會丟擲異常. 這對於人們是非常有用的, 如果程式缺少這個變數就不能執行.

使用以下語法:

Dotenv::required('DATABASE_DSN');

或者陣列來定義:

Dotenv::required(array('DB_HOST', 'DB_NAME', 'DB_USER', 'DB_PASS'));

如果 ENV 變數缺少, Dotenv 將丟擲一個 RuntimeException :

Required environment variable missing or value not allowed: 'DB_USER', 'DB_PASS'

允許的值

你可能看到了上邊的異常資訊, 你可以設定一個可能範圍值, 讓你的環境變數遵守這個規則

Dotenv::required('SESSION_STORE', array('Filesystem', 'Memcached'));

同樣的, 如果環境變數不在這個列表裡, 你會收到一個相似的異常資訊:

Required environment variable missing or value not allowed: 'SESSION_STORE'

註釋

可以使用 # 來註釋字元. E.g.

# this is a comment
VAR="value" # comment
VAR=value # comment

使用註釋

當一個開發者克隆你的程式碼庫. 他們會收到一個額外的手冊 一次性步驟 來手動的複製 .env.example 並且重新命名為 .env 並且追加上他們自己的值(或者從其他開發者哪裡獲取到其他敏感值).

phpdotenv 被用來建立開發者環境但是不應該用在生產環境下. 在生產環境下, 需要設定真實的變數而不必每次使用請求的時候都使用 .env 檔案進行過載.

這個可以通過自動化部署工具來實現, 例如: Vagrant, chef, Puppet, 或者手動的通過雲主機來實現, 例如: Pagodabox, Heroku.

參考

https://segmentfault.com/a/1190000010886175

相關文章