# 配置信息
## 介紹
>[success]Laravel 框架的所有配置文件都保存在`config`目錄中。每個選項都有說明,你可隨時查看這些文件并熟悉都有哪些配置選項可供你使用。
## 環境配置
對于應用程序運行的環境來說,不同的環境有不同的配置通常是很有用的。 例如,你可能希望在本地使用的緩存驅動不同于生產服務器所使用的緩存驅動。
Laravel 利用 Vance Lucas 的 PHP 庫?[DotEnv](https://github.com/vlucas/phpdotenv)?使得此項功能的實現變得非常簡單。在新安裝好的 Laravel 應用程序中,其根目錄會包含一個?`.env.example`?文件。如果是通過 Composer 安裝的 Laravel,該文件會自動更名為?`.env`。否則,需要你手動更改一下文件名。
>[danger]你的?`.env`?文件不應該提交到應用程序的源代碼控制系統中,因為每個使用你的應用程序的開發人員 / 服務器可能需要有一個不同的環境配置。此外,在入侵者獲得你的源代碼控制倉庫的訪問權的情況下,這會成為一個安全隱患,因為任何敏感的憑據都被暴露了。
如果是團隊開發,則可能希望應用程序中仍包含?`.env.example`?文件。因為通過在示例配置文件中放置占位值,團隊中的其他開發人員可以清楚地看到哪些環境變量是運行應用程序所必需的。你也可以創建一個?`.env.testing`?文件,當運行 PHPUnit 測試或以?`--env=testing`?為選項執行 Artisan 命令時,該文件將覆蓋?`.env`?文件中的值。
> {tip}`.env`?文件中的所有變量都可被外部環境變量(比如服務器級或系統級環境變量)所覆蓋。
### 環境變量類型
>[danger]`.env`文件中的所有變量都被解析為字符串,因此創建了一些保留值以允許你從`env()`函數中返回更多類型的變量:
| `.env`值 | `env()`值 |
| --- | --- |
| true | (bool) true |
| (true) | (bool) true |
| false | (bool) false |
| (false) | (bool) false |
| empty | (string) '' |
| (empty) | (string) '' |
| null | (null) null |
| (null) | (null) null |
如果你需要使用包含空格的值定義環境變量,可以通過將值括在雙引號中來實現。
~~~php
APP_NAME="My Application"
~~~
### 檢索環境配置
>[danger]當應用程序收到請求時,`.env`?文件中列出的所有變量將被加載到 PHP 的超級全局變量?`$ _ENV`?中。你可以使用?`env`?函數檢索這些變量的值。事實上,如果你查看 Laravel 的配置文件,你就能注意到有數個選項已經使用了這個函數:
~~~php
'debug' => env('APP_DEBUG', false),
~~~
傳遞給?`env`?函數的第二個值是「默認值」。如果給定的鍵不存在環境變量,則會使用該值。
### 確定當前環境
應用程序當前所處環境是通過?`.env`?文件中的?`APP_ENV`?變量確定的。你可以通過?`App`?[facade]中的?`environment`?方法來訪問此值:
~~~php
$environment = App::environment();
~~~
你還可以傳遞參數給?`environment`?方法,以檢查當前的環境配置是否與給定值匹配。 如果與給定值匹配,該方法將返回?`true`:
~~~php
if (App::environment('local')) {
// 當前環境是 local
}
if (App::environment(['local', 'staging'])) {
// 當前的環境是 local 或 staging...
}
~~~
> {tip} 應用程序當前所處環境檢測可以被服務器級的?`APP_ENV`?環境變量覆蓋。這在為相同的應用程序配置不同的環境時是非常有用的,這樣你可以在你的服務器配置中為給定的主機設置與其匹配的給定的環境。
## 訪問配置值
>[danger]你可以輕松地在應用程序的任何位置使用全局?`config`?函數來訪問配置值。配置值的訪問可以使用「點」語法,這其中包含了要訪問的文件和選項的名稱。還可以指定默認值,如果配置選項不存在,則返回默認值:
~~~php
$value = config('app.timezone');
~~~
要在運行時設置配置值,傳遞一個數組給?`config`?函數
~~~php
config(['app.timezone' => 'America/Chicago']);
~~~
## 配置緩存
為了給你的應用程序提升速度,你應該使用 Artisan 命令?`config:cache`?將所有的配置文件緩存到單個文件中。這會把你的應用程序中所有的配置選項合并成一個單一的文件,然后框架會快速加載這個文件。
通常來說,你應該把運行?`php artisan config:cache`?命令作為生產環境部署常規工作的一部分。這個命令不應在本地開發環境下運行,因為配置選項在應用程序開發過程中是經常需要被更改的。:
>[danger] {note} 如果在部署過程中執行?`config:cache`?命令,那你應該確保只從配置文件內部調用?`env`?函數。一旦配置被緩存,`.env`?文件將不再被加載,所有對?`env`?函數的調用都將返回?`null`。
## 維護模式
當應用程序處于維護模式時,所有對應用程序的請求都顯示為一個自定義視圖。這樣可以在更新或執行維護時輕松地「關閉」你的應用程序。 維護模式檢查包含在應用程序的默認中間件棧中。如果應用程序處于維護模式,則將拋出一個狀態碼為 503 的?`MaintenanceModeException`?異常。
要啟用維護模式,只需執行下面的 Artisan 命令?`down`:
~~~php
php artisan down
~~~
你還可以向?`down`?命令提供?`message`?和?`retry`?選項。其中?`message`?選項的值可用于顯示或記錄自定義消息,而?`retry`?值可用于設置 HTTP 請求頭中?`Retry-After`?的值:
~~~php
php artisan down --message="Upgrading Database" --retry=60
~~~
即使在維護模式下,也可以使用命令`allow`選項允許特定的 IP 地址或網絡訪問應用程序:
~~~php
php artisan down --allow=127.0.0.1 --allow=192.168.0.0/16
~~~
要關閉維護模式,請使用?`up`?命令:
~~~php
php artisan up
~~~
> {tip} 你可以通過修改?`resources/views/errors/503.blade.php`?模板文件來自定義默認維護模式模板。
#### 維護模式 & 隊列
當應用程序處于維護模式時,不會處理?[隊列任務](https://laravel-china.org/docs/laravel/5.7/queues)。而這些任務會在應用程序退出維護模式后再繼續處理。
#### 維護模式的替代方案
維護模式會導致應用程序有數秒的停機(不響應)時間,因此你可以考慮使用像?[Envoyer](https://envoyer.io/)?這樣的替代方案,以便與 Laravel 完成零停機時間部署。