Оказалось, что здесь было две проблемы:
1. $_ENV
заполняется, только если php.ini разрешает это , что, по-видимому, не выполняется по умолчанию, по крайней мере, при установке по умолчанию WAMP server .
; This directive determines which super global arrays are registered when PHP
; starts up. If the register_globals directive is enabled, it also determines
; what order variables are populated into the global space. G,P,C,E & S are
; abbreviations for the following respective super globals: GET, POST, COOKIE,
; ENV and SERVER. There is a performance penalty paid for the registration of
; these arrays and because ENV is not as commonly used as the others, ENV is
; is not recommended on productions servers. You can still get access to
; the environment variables through getenv() should you need to.
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
variables_order = "GPCS"
Когда я устанавливаю variables_order
обратно на EGPCS
, $_ENV
больше не пуст.
2. Когда вы используете SetEnv
в вашем .htaccess
, оно заканчивается в $_SERVER
, а не в $_ENV
, что, как я должен сказать, немного сбивает с толку, когда оно называется SetEnv
...
# .htaccess
SetEnv ENV dev
SetEnv BASE /ssl/
# php
var_dump($_SERVER['ENV'], $_SERVER['BASE']);
// string 'dev' (length=3)
// string '/ssl/' (length=5)
3. Функция getenv
сработала, потому что она, очевидно, ищет и $_ENV
и $_SERVER
. Кроме того, он, кажется, делает это нечувствительным к регистру, что может быть полезно.
var_dump(getenv('os'), getenv('env'));
// string 'Windows_NT' (length=10)
// string 'dev' (length=3)