Я использую файлы конфигурации apache для установки переменных среды, таких как DBPASS, в следующем примере:
<VirtualHost *:80>
ServerName project.localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/project
SetEnv DBPASS "softwaredeveloper"
<Directory "/var/www/html/project">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Затем я использую getenv в PHP, чтобы получить значение переменной следующим образом:
$pass = getenv("DBPASS")
Есть ли способ сохранить массивы как переменные среды в файле конфигурации apache? Я бы хотел получить в PHP такое значение:
[
"DBPASS" => "softwaredeveloper",
"LOG_CONFIG" => [
"LOG_FILE" => "/var/log/project/actions.log",
"DELIMITER" => ",",
"DATE_FORMAT" => "d.m.Y H:i:s",
"SHORT_DATE_FORMAT" => "d.m.Y"
]
]
Как мне добавить переменную LOG_CONFIG в конфигурацию apache?






Я думаю, что разумно предположить, что допустимая переменная среды должна быть парой строк ключ-значение и не может представлять более сложную структуру данных, такую как массив или объект - насколько мне известно, это так.
В любом случае стоит отметить, что когда getenv() вызывается с аргументом varname, тип возвращаемого значения будет либо string, если имя переменной существует, либо false, если имя переменной не существует.
Из документации PHP:
string getenv ( string $varname [, bool $local_only = FALSE ] )
Если вы выполните поиск по другим аналогичным вопросам в Stack Overflow, вы найдете несколько творческих обходных решений, которые предлагают преобразовать желаемую структуру в формат, который может быть представлен в виде строки, а затем декодирован при импорте в скрипт - например, строка значений с разделителями-запятыми. или объект в кодировке 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() для импорта всех требуемых переменных среды, стоит отметить, что при вызове getenv() без аргументов он возвращает все определенные переменные среды в виде ассоциативного массива:
$dbConfig = getenv(); // associative array
$dbPassword = $dbConfig['DB_PASSWORD'];
P.S: Если вам абсолютно необходима дополнительная структура в вашей конфигурации, ничего не стоит, если parse_ini_file() может выполнять некоторый ограниченный анализ структуры и типа конфигурации, но это, очевидно, означает, что вы должны сохранить свою конфигурацию в файлах .ini.
Я не думаю, что это возможно, но я не на 100%. Поиск по SO здесь вызывает несколько альтернативных подходов, включая расшифровка строк с разделителями-запятыми и декодирование JSON, но я думаю, что лично я бы предпочел простой подход, даже если он немного более повторяющийся, например
LOG_CONFIG_FILE,LOG_CONFIG_DELIMITERи т. д. Это также упрощает изменение значений по отдельности, что может быть важным в какой-то момент.