Я использую конфигурационные файлы 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 ] )
Если вы будете искать другие похожие вопросы по переполнению стека, вы найдете несколько творческих обходных путей, которые предлагают преобразовать желаемую структуру в формат, который можно представить в виде строки, а затем декодировать при импорте в сценарий, например строку значений, разделенных запятыми. или 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.
Других решений пока нет …