У меня есть несколько файлов php, которые я вызываю через AJAX. Все они имеют URL к моему config.php. Теперь у меня проблема в том, что мне всегда приходится вручную изменять URL-адреса этого файла конфигурации при развертывании новой версии на моем сервере.
Локальный путь:
define('__ROOT__', $_SERVER["DOCUMENT_ROOT"].'/mywebsite');
Путь к серверу:
define('__ROOT__', $_SERVER["DOCUMENT_ROOT"].'/../dev.my-website.tld/Modules/');
Я хочу отслеживать изменения во всех этих файлах PHP. Я ищу решение, чтобы автоматически изменить этот путь.
Например.
Это мой текущий рабочий процесс:
Местная среда:
Сервер:
Вы пытаетесь запустить разные базы кода между разработкой и реализацией, что не рекомендуется — они должны быть идентичными. Я решаю эту проблему, используя переменную окружения, чтобы указать, какой из нескольких файлов конфигурации должен быть загружен.
В моем 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
,
Чистый мерзавец способ достичь этого будет фильтры. Фильтры довольно крутые, но часто упускаются из виду. Думайте о фильтрах как о способе расширения ключевых слов, которым вы можете полностью управлять.
Зарегистрированная версия вашего файла будет, например, выглядеть так:
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.