Установка массива в качестве значения переменной среды в файле конфигурации 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?

Я не думаю, что это возможно, но я не на 100%. Поиск по SO здесь вызывает несколько альтернативных подходов, включая расшифровка строк с разделителями-запятыми и декодирование JSON, но я думаю, что лично я бы предпочел простой подход, даже если он немного более повторяющийся, например LOG_CONFIG_FILE, LOG_CONFIG_DELIMITER и т. д. Это также упрощает изменение значений по отдельности, что может быть важным в какой-то момент.

Darragh Enright 18.12.2018 18:09

Также стоит отметить, что вызов getenv() без аргумента varname вернет все определенные переменные среды в виде ассоциативного массива, что должно, по крайней мере, упростить перенос этих значений в ваш скрипт, а не набор вызовов getenv().

Darragh Enright 18.12.2018 18:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
2 198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

В любом случае стоит отметить, что когда 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.

Другие вопросы по теме