Я думаю, что разумно предположить, что допустимая переменная среды должна представлять собой пару строк ключ-значение и не может представлять более сложную структуру данных, такую как массив или объект - насколько мне известно, это так.
В любом случае стоит отметить, что когда getenv()
вызывается с аргументом varname, тип возвращаемого значения будет либо string
, когда существует имя varname, либоfalse
там, где имя переменной не существует.
Из документации PHP:
string getenv ( string $varname [, bool $local_only = FALSE ] )
Если вы будете искать другие похожие вопросы по переполнению стека, вы найдете несколько творческих обходных путей, которые предлагают преобразоватьжелаемую структуру в формате, который может быть представлен в виде строки и затем декодирован при импорте в сценарий, например строка значений с разделителями-запятыми или объект в кодировке JSON.
Например, предположим, что вы создали следующеепеременная окружения:
export DB_CONFIG='{"DB_NAME": "foo", "DB_PASSWORD": "bar"}'
Вы можете импортировать и декодировать ее в ассоциативный массив PHP,вот так:
$dbConfig = json_decode(getenv('DB_CONFIG'), true);
Это бы сработало, но я чувствую, что у него есть компромиссы, которые стоит рассмотреть, по сравнению с индивидуальной настройкой переменных среды.Это может или не может быть важным в зависимости от вашего варианта использования, но вы теряете возможность добавлять, изменять или удалять переменные среды независимо от других.
Например, вы можете периодически обновлять пароль базы данных, но сохранять одно и то же имя хоста и имя пользователя.
Конечно, проще обновить значение DB_PASSWORD
, чем воссоздать структуру данных.-кодировать его как строку, а затем обновить.В последнем случае вам необходимо убедиться, что внесенные вами изменения являются структурно и синтаксически правильными.
Поэтому, хотя и несколько повторяющиеся, я бы сказал, что установка отдельных значений - это самый простой и понятный подход:
export LOG_CONFIG_FILE="/var/log/project/actions.log"
export LOG_CONFIG_DELIMITER=","
export LOG_CONFIG_DATE_FORMAT="d.m.Y H:i:s"
export LOG_CONFIG_SHORT_DATE_FORMAT="d.m.Y"
# etc.
И, хотя, по моему личному мнению, сохранение вашей конфигурации как можно более выгодным.
Наконец, если вы хотите избежать повторения вызова getenv()
aНесколько раз для импорта всех необходимых вам переменных среды стоит отметить, что когда вы вызываете getenv()
без аргументов, он возвращает все определенные переменные среды в виде ассоциативного массива:
$dbConfig = getenv(); // associative array
$dbPassword = $dbConfig['DB_PASSWORD'];
PS: Есливам абсолютно необходима дополнительная структура в вашей конфигурации, и ничего не стоит, чтобы parse_ini_file()
мог выполнить некоторый ограниченный анализ структуры и типа конфигурации, но это, очевидно, означает, что вы должны хранить свою конфигурацию в файлах .ini.