Установка переменных PHP в httpd.conf?

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

Поэтому мне было интересно, могу ли я установить переменную PHP или константу в httpd.conf как часть определения виртуального хоста, которое сайт может затем использовать для автоматического указания на тестовую базу данных?

$database = 'live';
if (some staging environment variable is true) {
    $database = 'testing'; // and not live
}

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

Надеюсь, это имеет смысл

огромное спасибо

Ян


person Polsonby    schedule 28.09.2008    source источник
comment
Это не очень хорошая идея. По крайней мере, ИМХО. Используйте свой VC, сделайте тег и зафиксируйте необходимые изменения, и покончите с этим. Это будет намного чище, чем какая-то конфигурация на стороне сервера.   -  person Till    schedule 29.09.2008
comment
Мы выпускаем двадцать релизов в неделю, Тилль... Почему то, что ты предлагаешь, хорошая идея?   -  person Polsonby    schedule 09.10.2008
comment
Учтите, что сценарии оболочки, работающие за пределами apache, также должны знать свою среду.   -  person Vladimir Kornea    schedule 08.08.2014


Ответы (6)


Вы пытались использовать файл .htaccess? Вы можете переопределить значения php.ini, используя его.

Просто поместите файл .htaccess в каталог htdocs:

php_value name value

Дополнительная информация:

person Gravstar    schedule 28.09.2008
comment
Делать это через htaccess звучит гораздо лучше, чем через httpd.conf. - person Alex Weinstein; 28.09.2008
comment
Не согласен; делать это в разделе конфигурации vhost лучше, так как это означает, что вы можете полностью отключить .htaccess, что является приростом производительности для apache, поскольку ему не нужно проверять файл .htaccess для каждого запроса. - person El Yobo; 23.05.2010
comment
Если это все еще не работает, проверьте в своем httpd.conf команду AllowOverride none. Потратил 45 минут, пытаясь понять, почему мой файл .htaccess только что игнорируется. - person Frank Luke; 18.08.2011
comment
И как получить его в PHP? - person MestreLion; 18.02.2016

Да... вы можете сделать это:

SetEnv DATABASE_NAME testing

а затем в PHP:

$database = $_SERVER["DATABASE_NAME"];

or

$database = getenv("DATABASE_NAME");
person JW.    schedule 28.09.2008
comment
Насколько я знаю, это должно быть $_SERVER['DATABASE_NAME'] вместо $_ENV. Протестировано здесь на php 5.2 debian, и переменные вставлены не в $_ENV, а в $_SERVER - person ChrisR; 06.01.2010
comment
Похоже, ты прав. $_ENV работает в командной строке, но, похоже, не заполняется при работе под Apache. - person JW.; 06.01.2010
comment
Это больше похоже на ответ, который просил ОП. Принятый ответ предназначен для переопределения настроек. - person RickMeasham; 18.01.2013

Вы можете установить переменную среды и получить ее с помощью PHP.

В httpd.conf:

SetEnv database testing

В вашем PHP:

if (getenv('database') == 'testing') {

or

if ($_SERVER['database'] == 'testing') {
person Christian Lescuyer    schedule 28.09.2008
comment
Работает в апаче 2.4 - person MUY Belgium; 05.05.2020

Я бы не стал устанавливать переменную среды, так как это также видно в выходных данных скрипта по умолчанию, таких как PhpInfo();

просто используйте php_value в вашем .htaccess чуть выше папки htdocs, и все готово и безопасно :)

person SchizoDuckie    schedule 28.09.2008

Проблема с .htaccess заключается в том, что он является частью базового дерева кода. А базовое дерево кода является частью VC/SVN. Следовательно, любое изменение в local/dev перемещается в производство. Сохранение настройки переменной env в httpd.conf избавляет вас от необходимости быть осторожным, чтобы случайно не перезаписать флаг server vs dev. Если, конечно, вы не хотите использовать IP-адрес или имя хоста, оба из которых не являются масштабируемыми подходами.

person nitish    schedule 23.05.2012
comment
Не говоря уже о том, что вы также можете установить его при определении VirtualHost. - person Arda; 27.10.2013

Я тоже смотрел на этот тип решения. Я обнаружил, что в Apache вы можете использовать SetEnv KeyName DataValue в http.conf, а в IIS вы можете использовать Fast CGI Settings >> Edit... >> Environment Variables >> ... и добавить KeyName, DataValue.

Это, в свою очередь, позволяет установить для PHP $var = $_SERVER["KeyName"]; значение DataValue и последовательно использовать его по мере необходимости как в IIS, так и в Apache.

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

person S.Donovan    schedule 07.04.2017