Установка массива в качестве значения переменной среды в конфигурационном файле apache

Я использую конфигурационные файлы 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?

1

Решение

Я думаю, что разумно предположить, что допустимая переменная среды должна быть парой ключ-значение строк и не может представлять более сложную структуру данных, такую ​​как массив или объект — насколько мне известно, это так.

В любом случае стоит отметить, что когда getenv() вызывается с аргументом varname, тип возвращаемого значения будет либо string если имя существует, или 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() множество раз, чтобы импортировать все переменные среды, которые вам нужны, стоит отметить, что когда вы вызываете getenv() без аргументов возвращает все определенные переменные среды в виде ассоциативного массива:

$dbConfig = getenv(); // associative array
$dbPassword = $dbConfig['DB_PASSWORD'];

П.С .: Если вам абсолютно необходима дополнительная структура в вашей конфигурации, это ничего не стоит, что parse_ini_file() может выполнить некоторый ограниченный анализ структуры и типа конфигурации, но это, очевидно, означает, что вы должны хранить свою конфигурацию в файлах .ini.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector