Где хранить конфигурацию php приложения?

2019-02-01 17:04:09


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

Рассмотрим на простом примере как оптимизировать хранение настроек приложения.

Создадим файл index.php со следующим содержимым:


// Настройки для подключения к базе данных
$dbHost = 'localhost';
$dbUser = 'tester';
$dbPassword = 'fB8vh83gHj4';
$dbDatabase = 'my_base';

// Настройки для отправки почты через SMTP
$mailerHost = 'smtp.yandex.ru';
$mailerUsername = 'sender@test.ru';
$mailerPassword = 'fdDj3gf4Hbh';
$mailerPort = '465';
$mailerEncryption = 'SSL';

Мы видим 2 группы переменных: первая для подключения к базе данных, а вторая для отправки письма по smtp протоколу. Избавимся от многочисленных переменных, объединив все значения в один многомерный ассоциативный массив.


$config = [
    'db' => [
        'host' => 'localhost',
        'user' => 'tester',
        'password' => 'fB8vh83gHj4',
        'database' => 'my_base'
    ],
    'mailer' => [
        'host' => 'smtp.yandex.ru',
        'username' => 'sender@test.ru',
        'password' => 'Vbs3Hts42sdh',
        'port' => '465',
        'encryption' => 'SSL'
    ]
];

Уже лучше. В современных Web приложениях конфигурацию принято хранить в отдельном файле / файлах. Давайте создадим файл config.php, перенесём туда наш массив и подгрузим его в index.php

Подключать будем с помощью конструкциии require, использовав её полезную особенность - возможно выполнить выражение return внутри включаемого файла. Делать это нужно следующим образом:


// Код файла config.php
return [
    'db' => [
        'host' => 'localhost',
        'user' => 'tester',
        'password' => 'fB8vh83gHj4',
        'database' => 'my_base'
    ],
    'mailer' => [
        'host' => 'smtp.yandex.ru',
        'username' => 'sender@test.ru',
        'password' => 'Vbs3Hts42sdh',
        'port' => '465',
        'encryption' => 'SSL'
    ]
];

В файле конфигурации мы сделали return нашего массива. А в index.php присвоим этот массив переменной $config, используя выражение require.


// Код файла index.php
$config = require 'config.php';
print_r($config);

С помощью print_r выведем результат. Вот что у нас получилось:

Конфигурация php приложения

Если конфиг слишком большой, разбивать его на несколько файлов и собирайте с помощью require.

Хранение файла конфигурации в репозитории

При работе с git или mercurial репозиторием нужно придерживаться следующему правилу - не хранить реальные настройки приложения в репозитории.  Добавлять в репозиторий только структуру файла конфигурации, так называемый скелет.

Это нужно сделать по следующим причинам:

  • При хранении боевых настроек в репозитории они могут попасть не в те руки.
  • Если вы работаете в команде, у каждого её члена должны быть свои индивидуальный настройки (например конфиг для подключения к базе данных на  локальном компьютере).

Перейдём к практике. Создайте файл "config.sample.php". Скопируйте туда созержимое вашего файла конфигурации и удалите как минимум значения важных  (в нашем случае - паролей).


// Код файла config.sample.php
return [
    'db' => [
        'host' => 'localhost',
        'user' => '',
        'password' => '',
        'database' => ''
    ],
    'mailer' => [
        'host' => '',
        'username' => '',
        'password' => '',
        'port' => '465',
        'encryption' => 'SSL'
    ]
];

Добавьте файл config.sample.php в репозиторий. А боевой файл конфигурации config.php не должен туда попадать, поэтому исключите его из индексации, добавив строчку в файл ".gitignore":


config.php