Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Настройки и окружение

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

Файл настроек

Простейший способ — файл, который возвращает массив:

<?php
// config.php
 
return [
    'app_name' => 'Магазин',
    'per_page' => 20,
    'db' => [
        'host' => '127.0.0.1',
        'name' => 'shop',
    ],
];
<?php
// index.php
 
$config = require __DIR__ . '/config.php';
 
echo $config['db']['name']; // shop

require возвращает то, что вернул подключённый файл. Так хранят настройки, одинаковые для всех окружений.

Переменные окружения

Значения, которые меняются от сервера к серверу, и секреты передают через переменные окружения. Читает их функция getenv():

<?php
 
function env(string $key, mixed $default = null): mixed
{
    $value = getenv($key);
 
    return $value === false ? $default : $value;
}
 
echo env('SHOP_MODE', 'production'); // production

Если переменной нет, getenv() возвращает false — функция-обёртка подставляет значение по умолчанию.

Файл .env

При разработке переменные удобно держать в файле .env в корне проекта:

APP_ENV=local
DB_HOST=127.0.0.1
DB_NAME=shop
DB_PASSWORD=secret

Формат совпадает с ini-файлом, поэтому разобрать его можно встроенной функцией:

<?php
 
$env = parse_ini_string("APP_ENV=local\nDB_HOST=127.0.0.1\nDB_NAME=shop");
 
echo $env['DB_NAME']; // shop

Для файла используют parse_ini_file(__DIR__ . '/.env').

Библиотека phpdotenv

В настоящих проектах .env читает библиотека — она понимает кавычки, комментарии и проверяет обязательные переменные:

composer require vlucas/phpdotenv
<?php
// bootstrap.php
 
require 'vendor/autoload.php';
 
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$dotenv->required(['DB_HOST', 'DB_NAME']);
 
$pdo = new PDO(
    "mysql:host={$_ENV['DB_HOST']};dbname={$_ENV['DB_NAME']}",
    $_ENV['DB_USER'],
    $_ENV['DB_PASSWORD'],
);

Что хранить в репозитории

ФайлВ репозиторииСодержимое
.envНетНастоящие значения и секреты
.env.exampleДаСписок переменных без секретов
config.phpДаОбщие настройки, чтение переменных

Файл .env добавляют в .gitignore. Новый разработчик копирует .env.example в .env и вписывает свои значения.

Режимы работы

Переменная APP_ENV сообщает коду, где он запущен. От неё зависит, например, показ ошибок:

<?php
// bootstrap.php
 
$isLocal = getenv('APP_ENV') === 'local';
 
ini_set('display_errors', $isLocal ? '1' : '0');
ini_set('log_errors', '1');
error_reporting(E_ALL);

На своём компьютере ошибки видны на странице, на сервере — только в журнале.

Частая ошибка

Файл .env, попавший в репозиторий или лежащий в общедоступной папке сайта, выдаёт все пароли. Проверьте две вещи: .env указан в .gitignore, а корень сайта на сервере — папка public, а не сам проект. Если секрет всё же попал в репозиторий, его нужно сменить: из истории изменений он никуда не денется.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.