自動將環境變數從.env
載入到getenv()
、 $_ENV
和$_SERVER
。
您絕對不應該在程式碼中儲存敏感憑證。在環境中儲存配置是十二要素應用程式的原則之一。部署環境之間可能發生變化的任何內容(例如資料庫憑證或第三方服務的憑證)都應從程式碼中提取到環境變數中。
基本上, .env
檔案是載入應用程式所需的自訂設定變數的簡單方法,而無需修改 .htaccess 檔案或 Apache/nginx 虛擬主機。這意味著您不必編輯專案外部的任何文件,並且無論您如何運行專案(Apache、Nginx、CLI,甚至 PHP 的內建 Web 伺服器),所有環境變數始終都會設定。它比您所知道的所有其他設定環境變數的方法要容易得多,而且您一定會喜歡它!
php_value
標誌PHP dotenv 是原始 Ruby dotenv 的 PHP 版本。
透過 Composer 安裝非常簡單:
$ composer require vlucas/phpdotenv
或手動將其新增至您的composer.json
檔案。
我們遵循語義版本控制,這意味著主要版本之間可能會發生重大變更。我們在此處提供了 V2 到 V3、V3 到 V4 以及 V4 到 V5 的升級指南。
.env
檔案通常不受版本控制,因為它可能包含敏感的 API 金鑰和密碼。創建一個單獨的.env.example
文件,其中定義了除敏感變量之外的所有必需環境變量,這些變量要么是用戶為自己的開發環境提供的,要么是在其他地方傳遞給項目協作者的。然後,專案協作者獨立地將.env.example
檔案複製到本地.env
並確保所有設定對於其本地環境而言都是正確的,並在必要時填寫金鑰或提供自己的值。在此用法中, .env
檔案應新增至專案的.gitignore
檔案中,以便協作者永遠不會提交它。這種用法可確保版本控制歷史記錄中不會出現敏感密碼或 API 金鑰,因此安全漏洞的風險較小,且生產值永遠不必與所有專案協作者共用。
將應用程式設定新增至專案根目錄中的.env
檔案。確保.env
檔案已新增到您的.gitignore
中,這樣就不會在程式碼中簽入它
S3_BUCKET= " dotenv "
SECRET_KEY= " souper_seekret_key "
現在建立一個名為.env.example
的檔案並將其簽入專案中。這應該具有您需要設定的 ENV 變量,但值應該為空或填充虛擬資料。這個想法是讓人們知道需要什麼變量,但不給他們敏感的生產值。
S3_BUCKET= " devbucket "
SECRET_KEY= " abc123 "
然後,您可以使用以下命令在應用程式中載入.env
:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> load ();
要抑制沒有.env
檔案時引發的異常,您可以:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> safeLoad ();
如果您想使用.env
以外的其他內容,您可以選擇傳入檔案名稱作為第二個參數:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ , ' myconfig ' );
$ dotenv -> load ();
所有定義的變數現在都可以在$_ENV
和$_SERVER
超級全域變數中使用。
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
強烈建議不要使用getenv()
和putenv()
因為這些函數不是線程安全的,但仍然可以指示 PHP dotenv 使用這些函數。您可以呼叫Dotenv::createImmutable
來代替呼叫Dotenv::createUnsafeImmutable
,這將在幕後新增PutenvAdapter
。您的環境變數現在可以使用getenv
方法以及超級全域變數:
$ s3_bucket = getenv ( ' S3_BUCKET ' );
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
可以將一個環境變數嵌套在另一個環境變數中,這對於減少重複很有用。
這是透過將現有環境變數包裝在${…}
中來完成的,例如
BASE_DIR= " /var/webroot/project-root "
CACHE_DIR= " ${BASE_DIR} /cache "
TMP_DIR= " ${BASE_DIR} /tmp "
不變性是指是否允許 Dotenv 覆蓋現有的環境變數。如果您希望 Dotenv 覆蓋現有環境變量,請使用createMutable
而不是createImmutable
:
$ dotenv = Dotenv Dotenv :: createMutable ( __DIR__ );
$ dotenv -> load ();
在幕後,這是指示「儲存庫」是否允許不變性。預設情況下,儲存庫配置為允許預設覆蓋現有值,如果使用RepositoryBuilder
呼叫「create」方法來建構更自訂的儲存庫,則這是相關的:
$ repository = Dotenv Repository RepositoryBuilder :: createWithNoAdapters ()
-> addAdapter ( Dotenv Repository Adapter EnvConstAdapter ::class)
-> addWriter ( Dotenv Repository Adapter PutenvAdapter ::class)
-> immutable ()
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
上面的範例將載入的值寫入$_ENV
和putenv
,但是在插入環境變數時,我們只會從$_ENV
讀取。此外,它永遠不會替換加載文件之前已經設定的任何變數。
透過另一個範例,也可以指定一組要被允許列出的變數。也就是說,只會載入允許列表中的變數:
$ repository = Dotenv Repository RepositoryBuilder :: createWithDefaultAdapters ()
-> allowList ([ ' FOO ' , ' BAR ' ])
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
PHP dotenv 具有內建驗證功能,包括強制環境變數的存在。這對於讓人們了解任何明確的必需變量特別有用,如果沒有這些變量,您的應用程式將無法運行。
您可以使用單一字串:
$ dotenv -> required ( ' DATABASE_DSN ' );
或者字串數組:
$ dotenv -> required ([ ' DB_HOST ' , ' DB_NAME ' , ' DB_USER ' , ' DB_PASS ' ]);
如果缺少任何 ENV 變量,Dotenv 將拋出RuntimeException
如下所示:
One or more environment variables failed assertions: DATABASE_DSN is missing
除了簡單地要求設定變數之外,您可能還需要確保該變數不為空:
$ dotenv -> required ( ' DATABASE_DSN ' )-> notEmpty ();
如果環境變數為空,你會得到一個異常:
One or more environment variables failed assertions: DATABASE_DSN is empty
您可能還需要確保變數是整數值。您可以執行以下操作:
$ dotenv -> required ( ' FOO ' )-> isInteger ();
如果環境變數不是整數,你會得到一個異常:
One or more environment variables failed assertions: FOO is not an integer.
人們可能只想在設定變數時強制執行驗證規則。我們也支持這一點:
$ dotenv -> ifPresent ( ' FOO ' )-> isInteger ();
您可能需要確保變數採用布林值形式,接受「true」、「false」、「On」、「1」、「Yes」、「Off」、「0」和「No」。您可以執行以下操作:
$ dotenv -> required ( ' FOO ' )-> isBoolean ();
如果環境變數不是布林值,您將收到異常:
One or more environment variables failed assertions: FOO is not a boolean.
同樣,人們可以這樣寫:
$ dotenv -> ifPresent ( ' FOO ' )-> isBoolean ();
也可以定義環境變數應具有的一組值。這在程式碼實際上僅支援少數選項或驅動程式的情況下特別有用:
$ dotenv -> required ( ' SESSION_STORE ' )-> allowedValues ([ ' Filesystem ' , ' Memcached ' ]);
如果環境變數不在允許值清單中,您將得到類似的異常:
One or more environment variables failed assertions: SESSION_STORE is not an allowed value.
也可以定義您的環境變數應該是的正規表示式。
$ dotenv -> required ( ' FOO ' )-> allowedRegexValues ( ' ([[:lower:]]{3}) ' );
您可以使用#
字元註解您的.env
檔。例如
# this is a comment
VAR= " value " # comment
VAR=value # comment
有時您只想透過給我們一個字串來解析文件並解析嵌套的環境變量,然後將一個數組傳回給您。雖然這已經是可能的,但有點麻煩,所以我們提供了一種直接的方法來做到這一點:
// ['FOO' => 'Bar', 'BAZ' => 'Hello Bar']
Dotenv Dotenv :: parse ( " FOO=Bar n BAZ= " Hello $ {FOO} "" );
這與以下完全相同:
Dotenv Dotenv :: createArrayBacked ( __DIR__ )-> load ();
只是,您沒有提供查找文件的目錄,而是直接提供了文件內容。
當新開發人員克隆您的程式碼庫時,他們將需要執行額外的一次性步驟,將.env.example
檔案手動複製到.env
並填寫自己的值(或從專案同事獲取任何敏感值)。
在某些伺服器設定中(最常見於共用主機),PHP 可能會停用$_ENV
或$_SERVER
等超全域變數。如果未設定這些變量,請檢查php.ini
檔案中的variables_order
。請參閱 php.net/manual/en/ini.core.php#ini.variables-order。
如果您發現此軟體包中存在安全漏洞,請發送電子郵件至 [email protected]。所有安全漏洞都將及時解決。您可以在此處查看我們完整的安全政策。
PHP dotenv 根據 BSD 3-Clause License 授權。
作為 Tidelift 訂閱的一部分提供
vlucas/phpdotenv
和數千個其他軟體包的維護者正在與 Tidelift 合作,為您用於構建應用程式的開源依賴項提供商業支援和維護。節省時間、降低風險並改善程式碼運作狀況,同時向您使用的確切依賴項的維護者付費。了解更多。