2014-12-22 1 views
2

У меня есть несколько php-файлов, которые я вызываю через вызовы AJAX. У всех есть URL-адрес моего config.php. Теперь у меня проблема, что мне всегда приходится вручную менять URL-адреса в этот файл конфигурации, когда я развертываю новую версию на своем сервере.Как изменить различные параметры конфигурации между средами в PHP?

Локальный путь:

define('__ROOT__', $_SERVER["DOCUMENT_ROOT"].'/mywebsite'); 

сервера Путь:

define('__ROOT__', $_SERVER["DOCUMENT_ROOT"].'/../dev.my-website.tld/Modules/'); 

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

E.g. Это мой текущий рабочий процесс:

Локальная среда:

  • (путь версия)
  • делать изменения в коде
  • мерзавца добавить, мерзавец совершает, Git слияние, Git толчок к моему серверу

Сервер:

  • мерзавец сброса --hard
  • путь изменения в версии B
+0

Хороший вопрос. Я снял дополнительный вопрос о Gulp, поскольку это скорее дополнение к этому вопросу (мы предпочитаем по одному здесь), и это было довольно общее. Я подозреваю, что вы найдете, что вам это не понадобится, но если вы хотите использовать его в своем процессе развертывания, он, вероятно, заслуживает своего собственного вопроса. – halfer

ответ

3

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

В моем Apache виртуальный хост я сделать что-то вроде этого:

SetEnv ENVIRONMENT_NAME local 

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

function getEnvironmentName() 
{ 
    $envKeyName = 'ENVIRONMENT_NAME'; 
    $envName = isset($_SERVER[$envKeyName]) ? $_SERVER[$envKeyName] : null; 
    if (!$envName) 
    { 
     throw new \Exception('No environment name found, cannot proceed'); 
    } 

    return $envName; 
} 

Это имя среды можно затем использовать в конфиге файл до include или для извлечения значений из одного массива с ключом в среде.

Я часто сохраняю настройки среды в папке с именем configs/, но вы можете хранить их в любом месте, где это имеет смысл в вашем приложении. Так, например, вы могли бы иметь этот файл:

// This is /configs/local.php 

return array(
    'path' => '/mywebsite', 
    // As many key-values as you want 
); 

Вы можете сделать это (предполагая, что ваш передний контроллер является один уровень глубоко в проекте, например, в /web/index.php):

$root = dirname(__DIR__); 
$config = include($root . '/configs/' . getEnvironmentName() . '.php'); 

Вы тогда имеют доступ к соответствующим настройкам для среды в $config.

+0

Но чтобы получить доступ к этой функции, вам также необходимо указать путь к «functions.php». Или вы включаете этот php-код в каждый php-файл? Если бы я понял вас, я бы определил два окружающих vars. Затем используйте эту функцию, чтобы вернуться либо к «локальному», либо к «серверу». После этого я запускаю еще одну функцию, которая устанавливает путь в соответствии с переменной окружения. Переменная окружения может быть установлена ​​в .htaccess? EDIT: или, может быть, проще, если я просто определяю корневой путь в htaccess –

+0

Я добавил пример того, как получить доступ к конфигурационному файлу. Для загрузки библиотек вы можете использовать '__DIR__', который является каталогом, в котором отображается ваш передний контроллер (index.php). Есть несколько способов передвижения вверх по дереву оттуда, если вам нужно, в зависимости от того, где находится ваш передний контроллер в вашем проекте. – halfer

+0

(Итак, чтобы ответить на ваш вопрос, ответ отрицательный: вам нужен только один env var. Вы загружаете библиотеки, читая расположение вызываемого PHP-скрипта и выбирая из него полный путь). – halfer

1

Чистый git способ достичь этого будет filters. Фильтры довольно прохладные, но часто пропускаются. Думайте о фильтрах как git-способе расширения ключевых слов, которые вы можете полностью контролировать.

Проверенная в версии файла будет, например, выглядеть следующим образом:

define('__ROOT__', 'MUST_BE_REPLACED_BY_SMUDGE'); 

Затем установите два фильтра:

  • на локальном компьютере, вы бы создали smudge фильтр, который заменяет
    'MUST_BE_REPLACED_BY_SMUDGE'
    с
    $_SERVER["DOCUMENT_ROOT"].'/mywebsite'

  • на вашем сервере, вы создали smudge фильтр, который заменяет
    'MUST_BE_REPLACED_BY_SMUDGE'
    с
    $_SERVER["DOCUMENT_ROOT"].'/../dev.my-website.tld/Modules/'

  • на обеих машинах clean фильтр будет восстановить линию, чтобы быть
    define('__ROOT__', 'MUST_BE_REPLACED_BY_SMUDGE');

Дополнительная информация abou t фильтры можно найти в this answer и в Git Book.

+0

Вы проверили бы начальный файл (ваш первый фрагмент), а затем добавили бы его в '.gitignore'? После того, как он сделал свое расширение локально, вы хотели бы убедиться, что вы случайно не проверяете расширенную версию. – halfer

+0

@halfer: вы должны проверить версию с помощью заполнителя. Задача фильтра 'clean' заключается в том, чтобы убедиться, что версия с заполнителем включена и задание фильтра« smudge »для внесения изменений для каждого местоположения. И .gitignore не содержит файл для изменения. Это регулярно проверяется в файле. – eckes

+0

Правильно, я этого не понимаю - кажется, мне нужно добавить это в мой список чтения! +1 для интересного вклада, хотя я не думаю, что модификация кода является подходящим решением здесь. – halfer

Смежные вопросы