一般咱們在維護PHP線上項目的時候,爲了隔離配置和代碼,會使用fastcgi_param的形式將環境變量定義在Nginx的配置文件中(Apache能夠使用SetEnv指令)。這樣在PHP-FPM運行過程當中就能夠使用getenv函數獲取到環境變量的值了。函數

那對於PHP-CLI,咱們又應該怎麼設置它的環境變量呢?作法也很簡單。spa

在終端直接執行:.net

  1. $ export ART_ENV=production

後續直接使用PHP-CLI命令的時候天然能夠獲取到環境變量ART_ENV的值:code

  1. $ php -r "var_dump(getenv('ART_ENV'));"
  2. string(10) "production"

可是一般還有這種狀況:咱們當前登陸的用戶並非合適的用來運行PHP-CLI腳本的用戶,好比咱們期待使用www-data用戶來運行PHP-CLI腳本,一般咱們會這樣作:文檔

  1. $ sudo -u www-data php -r "var_dump(getenv('ART_ENV'));"
  2. bool(false)

這時候就會發現沒法獲取到環境變量了。查看sudo --help能夠發現咱們還須要設置-E參數:get

  1. $ sudo --help
  2. ...
  3. -E, --preserve-env preserve user environment when running command

按照文檔說明補上便可:string

  1. $ sudo -E -u www-data php -r "var_dump(getenv('ART_ENV'));"
  2. string(10) "production"

或者更直接點直接指定環境變量的值:it

  1. $ sudo -u www-data ART_ENV=testing php -r "var_dump(getenv('ART_ENV'));"
  2. string(7) "testing"

須要注意的是:這裏的PHP代碼都必須使用getenv函數獲取環境變量,不能單純依賴全局變量$_ENV。全局變量$_ENV並不老是可用的,除非在php.ini文件中顯式設置了variables_order的值包含E,例如variables_order = "EGPCS"。更多的詳細信息能夠參考PHP文檔的全局變量部分。io