Автоопределение внутренней / внешней среды разработки - PullRequest
8 голосов
/ 09 апреля 2010

Мы используем следующую функцию для автоматического определения того, находимся ли мы на машине внутри или на работающем сервере, а затем выбираем соответствующие конфиги для различных компонентов:

function devIsLocal(){

    $res=false;

    $http_host=$_SERVER['HTTP_HOST'];

    if($http_host=='localhost')$res=true;
    if($http_host=='127.0.0.1')$res=true;
    if(substr($http_host,-4)=='.lan')$res=true;
    if(strpos($http_host, '.')===false)$res=true;

    return($res);

}

Как видите, он опирается только на значение HTTP_HOST.

Конечно, если вы используете какой-то виртуальный хост локально, например example.com, функция будет обманута.

Есть ли другие способы обмануть функцию? и какие другие переменные / места мы могли бы посмотреть, чтобы определить, где мы находимся?

Ответы [ 5 ]

15 голосов
/ 09 апреля 2010

Установите переменную среды в конфигурации вашего виртуального хоста Apache.Так Zend Framework делает это.

См. Краткое руководство по ZF для примера (раздел «Создание виртуального хоста»).

В вашемhttpd.conf или файл .htaccess, поместите:

SetEnv APPLICATION_ENV "development"

Затем в вашем приложении используйте функцию getenv , чтобы получить значение:

$environment = getenv("APPLICATION_ENV");
if ($environment == "development")
{
    // do development stuff
}
else if ($environment == "live")
{
    // do live stuff
}
11 голосов
/ 09 апреля 2010
'127.0.0.1' == $_SERVER["REMOTE_ADDR"]

Это никогда не будет оцениваться как TRUE в вашей действующей системе. :)

3 голосов
/ 09 апреля 2010

Добавление к Ответ Энди Шеллама ..

Если вы используете mod_vhost_alias или у вас есть разные домены с одним (виртуальным) корнем документа, вы можете установить переменную в зависимости от параметров, например,

SetEnvIf SERVER_ADDR x.x.x.x APPLICATION_ENV=development
SetEnvIf HTTP_HOST abc.example.com APPLICATION_ENV=development
1 голос
/ 09 апреля 2010

Создание, а затем поиск файла, который существует только в файловой системе действующего сервера.

Конечно, ваша среда должна быть максимально похожей; то, что я предлагаю, выглядит примерно так: в каталоге / var / environment / есть файл с именем {devel | test | qa | staging | live}, в зависимости от того, на каком сервере вы находитесь, - затем просто проверьте имя файла.

Конечно, вам нужно исключить этот файл из контроля версий и из любого процесса сборки, который у вас может быть.

0 голосов
/ 09 апреля 2010

Конечно, если вы используете виртуальный хост локально, как example.com, функция будет обманута.

Также, если хост не является локальным, но использует карту виджета или vhost defn по умолчанию и пользователь добавляет IP-адрес в файл hosts локально.

Я бы порекомендовал иметь каталог на пути включения, который также существует в прямом эфире, но не реплицируется там - и просто хранить:

function getEnv(){
  return 'Live';
}

или

function getEnv(){
  return 'Test';
}

Если оба envs находятся на одном сервере - вы можете сделать это, установив include_path в конфигурации Apache или .htaccess.

Это также позволяет вам разделять потенциально конфиденциальные данные env, такие как хосты / пароли базы данных и ключи шифрования.

С

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...