git — Как изменить различные настройки конфигурации между средами в PHP?

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

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

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

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

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

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

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

Местная среда:

  • (путь версии A)
  • сделать изменения в коде
  • git add, git commit, git merge, git push на мой сервер

Сервер:

  • git reset —hard
  • изменить путь к версии B

2

Решение

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

В моем Apache vhost я делаю что-то вроде этого:

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,

3

Другие решения

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

Зарегистрированная версия вашего файла будет, например, выглядеть так:

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');

Дополнительную информацию о фильтрах можно найти в этот ответ и в Git Book.

1

По вопросам рекламы [email protected]