Конфигурация PHP: файл settings.php и его возможности

Раздел: Настройка PHP -> Конфигурация PHP

Как обеспечить гибкую и безопасную конфигурацию приложения?

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


<?php
// settings.php - пример загрузки переменных окружения с помощью dotenv
require_once __DIR__ . '/vendor/autoload.php';

use Dotenv\Dotenv;

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Определение констант приложения на основе окружения
define('DB_HOST', $_ENV['DB_HOST'] ?? 'localhost');
define('DB_NAME', $_ENV['DB_NAME']);
define('DB_USER', $_ENV['DB_USER']);
define('DB_PASS', $_ENV['DB_PASS']);
define('APP_DEBUG', filter_var($_ENV['APP_DEBUG'] ?? false, FILTER_VALIDATE_BOOLEAN));

if (APP_DEBUG) {
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
}

Пояснение: библиотека vlucas/phpdotenv загружает переменные из файла .env, который не должен попадать в репозиторий. Константы определяются с проверками на случай отсутствия ключей. Режим отладки включается через логический фильтр.

Типичные проблемы и решения:

  • Файл .env не найден - проверить путь и наличие файла. Добавить проверку if (!file_exists(__DIR__.'/.env')) { ... }.
  • Константа уже определена - использовать defined() или переименовать.
  • Значения с пробелами в кавычках - в .env допускаются строки, но осторожно с пробелами; лучше оборачивать в двойные кавычки.

Как задать настройки жестко в самом файле settings.php?

Простой способ для небольших проектов - определять константы прямо в файле без внешних зависимостей.


<?php
// settings.php - жёсткая конфигурация
define('DB_HOST', 'localhost');
define('DB_NAME', 'mydatabase');
define('DB_USER', 'root');
define('DB_PASS', 'secret');
define('APP_DEBUG', true);

if (APP_DEBUG) {
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
}

Подходит для локальной разработки или когда окружение стабильно. Недостаток: чувствительные данные (пароли) хранятся в коде и могут попасть в систему контроля версий.

Возможные ошибки:

  • Жёстко заданные настройки сложно менять без редактирования файла.
  • При развертывании на нескольких серверах приходится каждый раз править файл.

Как настроить PHP-директивы внутри settings.php с помощью ini_set?

Иногда требуется изменить поведение PHP на лету, например, увеличить лимит памяти или время выполнения.


<?php
// settings.php - динамические настройки PHP
ini_set('memory_limit', '256M');
ini_set('max_execution_time', 300);
ini_set('upload_max_filesize', '64M');
ini_set('post_max_size', '64M');
ini_set('date.timezone', 'Europe/Moscow');

Эти вызовы должны выполняться до любого кода, который зависит от этих параметров. Не все директивы можно изменить через ini_set (смотрите документацию).

Распространённые трудности:

  • Попытка изменить директиву, помеченную как PHP_INI_SYSTEM, приведёт к ошибке (например, disable_functions).
  • Изменения влияют только на текущий запрос, не на весь сервер.

Как вернуть настройки из файла через массив?

Альтернативный подход - возвращать массив параметров из settings.php и использовать его в приложении.


<?php
// settings.php
return [
    'db' => [
        'host' => 'localhost',
        'name' => 'mydatabase',
        'user' => 'root',
        'pass' => 'secret',
    ],
    'app' => [
        'debug' => true,
        'timezone' => 'Europe/Moscow',
    ],
];

Применение: $config = require 'settings.php';. Позволяет сгруппировать настройки и легко мержить с другими конфигурациями.

Нюансы:

  • При многократном вызове require файл будет выполнен каждый раз - для кэширования нужен мемоиз.
  • Массив может содержать чувствительные данные, те же риски хранения в коде.

Дополнительные примеры конфигурации через settings.php

Пример с поддержкой нескольких окружений (dev, prod)

Создаются отдельные файлы settings.dev.php и settings.prod.php, а основной settings.php загружает нужный в зависимости от переменной окружения.

Пример

<?php
// settings.php - мультисредовой загрузчик
$env = getenv('APP_ENV') ?: 'prod';
$configFile = __DIR__ . '/settings.' . $env . '.php';

if (!file_exists($configFile)) {
    throw new \RuntimeException("Configuration file for environment '{$env}' not found.");
}

$config = require $configFile;

// Используем $config['db'], $config['app'] и т.д.
define('DB_HOST', $config['db']['host']);
define('APP_DEBUG', $config['app']['debug']);
Пример

<?php
// settings.dev.php - настройки для разработки
return [
    'db' => ['host' => 'localhost', 'name' => 'dev_db', 'user' => 'dev', 'pass' => 'devpass'],
    'app' => ['debug' => true, 'timezone' => 'UTC'],
];
Пример

<?php
// settings.prod.php - настройки для продакшена
return [
    'db' => ['host' => 'prod-db.example.com', 'name' => 'prod_db', 'user' => 'prod', 'pass' => 'prodpass'],
    'app' => ['debug' => false, 'timezone' => 'Europe/Moscow'],
];

Результат вызова в зависимости от переменной APP_ENV.

Пример с использованием констант для сложных путей

Удобно определить базовые пути и использовать их в приложении.

Пример

<?php
// settings.php
define('BASE_DIR', __DIR__);
define('LOG_DIR', BASE_DIR . '/var/log');
define('CACHE_DIR', BASE_DIR . '/var/cache');
define('UPLOAD_DIR', BASE_DIR . '/public/uploads');

if (!is_dir(LOG_DIR)) {
    mkdir(LOG_DIR, 0755, true);
}
// проверка и создание каталогов при необходимости

Результат: каталоги создаются автоматически при отсутствии.

Пример с фильтрацией входных данных из .env

Использование фильтров для приведения типов.

Пример

<?php
// settings.php с фильтрацией
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

define('DB_PORT', (int) ($_ENV['DB_PORT'] ?? 3306));
define('APP_DEBUG', (bool) ($_ENV['APP_DEBUG'] ?? false));
define('MAX_UPLOAD_SIZE', (int) ($_ENV['MAX_UPLOAD_SIZE'] ?? 2) * 1024 * 1024); // MB в байты

Пример вывода: если в .env MAX_UPLOAD_SIZE=10, то константа будет равна 10485760.

Пример с валидацией обязательных настроек

Проверка наличия критичных параметров перед запуском приложения.

Пример

<?php
// settings.php - проверка обязательных переменных
$required = ['DB_HOST', 'DB_NAME', 'DB_USER', 'DB_PASS'];
foreach ($required as $key) {
    if (!isset($_ENV[$key]) || empty($_ENV[$key])) {
        throw new \InvalidArgumentException("Missing required environment variable: {$key}");
    }
    define($key, $_ENV[$key]);
}

Результат: если какая-то переменная отсутствует, скрипт завершится с исключением.

- Php режим (режимы работы php)
- Set limit php (установка лимита в php)
- настройка settings php (настройка файла settings.php)
- Php extension required (требуемое расширение php)
- Php max upload (максимальный размер загрузки в php)

Настройка файла settings.php - comments

En
настройка settings php (php)