Настройки и окружение
Пароль базы данных, ключ платёжной системы, адрес сайта на вашем компьютере и на сервере разные. Если вписать их прямо в код, его придётся править при каждом переносе, а секреты попадут в репозиторий. Настройки хранят отдельно от кода.
Файл настроек
Простейший способ — файл, который возвращает массив:
<?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']; // shoprequire возвращает то, что вернул подключённый файл. Так хранят настройки, одинаковые для всех окружений.
Переменные окружения
Значения, которые меняются от сервера к серверу, и секреты передают через переменные окружения. Читает их функция 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, а не сам проект. Если секрет всё же попал в репозиторий, его нужно сменить: из истории изменений он никуда не денется.