Где хранить config.php? Полное руководство по администрированию PHP-конфигурации

Раздел: Администрирование PHP -> Конфигурация PHP-приложений

Основные варианты расположения config.php

Где разместить config.php, чтобы код был доступен из всех скриптов?

Один из распространённых подходов - поместить файл config.php в корневую директорию проекта. Такой способ прост для понимания начинающими разработчиками, но создаёт риск случайного доступа к нему через веб-сервер, если не настроены правила запрета.

// Пример config.php в корне проекта (например, /var/www/html/config.php)
<?php
return [
    'db_host' => 'localhost',
    'db_user' => 'root',
    'db_pass' => 'secret',
];
?>

Nextcloud config config php (config.php в nextcloud)

Типичная ошибка: если файл имеет расширение .php, он может быть выполнен при прямом обращении через браузер (например, example.com/config.php). Это приводит к утечке данных. Решение: добавить в начале файла exit() или использовать расширение .php и размещать вне document root.

Как сделать config.php недоступным через веб-сервер, но доступным для include?

Лучший способ - разместить файл за пределами корневой директории веб-сервера (document root). Например, если document root - /var/www/html, то config.php можно положить в /var/www/config.php. Тогда включать его через относительный путь с использованием __DIR__.

// index.php (в корне document root)
<?php
$config = require __DIR__ . '/../config.php';
?>

Wp config php (config.php в wordpress)

Проблема: путь может меняться при перемещении скрипта. Решение: использовать константу ROOT_DIR, определённую в точке входа.

Какие альтернативы хранению конфигурации в PHP-файле существуют?

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

// .env
DB_HOST=localhost
DB_USER=root
DB_PASS=secret

// index.php
<?php
require 'vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
echo $_ENV['DB_HOST'];
?>

Config php mysql (конфигурация mysql в php)

Ошибка: публикация .env в репозиторий приведёт к компрометации данных. Решение: добавить .env в .gitignore и использовать .env.example.

Как организовать конфигурацию для разных окружений (development, production)?

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

// bootstrap.php
<?php
$env = getenv('APP_ENV') ?: 'prod';
$configFile = __DIR__ . '/config.' . $env . '.php';
if (!file_exists($configFile)) {
    throw new \RuntimeException('Config file not found: ' . $configFile);
}
$config = require $configFile;
?>

Config php https (настройка https в config.php)

Проблема: при неправильной установке переменной окружения приложение может загрузить неверный конфиг. Решение: задавать значение в .env или в настройках веб-сервера.

Наиболее эффективное решение: размещение config.php вне document root

Этот вариант сочетает безопасность и простоту. Файл конфигурации не доступен извне, но легко подключается через абсолютный путь. Рекомендуется дополнительно проверять наличие файла и прав доступа.

// config.php (например, /var/www/private/config.php)
<?php
return [
    'db' => [
        'host' => getenv('DB_HOST') ?: 'localhost',
        'name' => 'app_db',
        'user' => 'user',
        'pass' => 'pass'
    ]
];
?>

// public/index.php
<?php
$config = require dirname(__DIR__, 2) . '/private/config.php';
echo $config['db']['host']; // localhost
?>

Возможная проблема: при перемещении проекта пути ломаются. Решение: определить константу BASE_DIR в общем автозагрузчике.

- Admin config php (административный config.php)

Расширенные примеры работы с расположением config.php

Пример 1. Динамический выбор конфигурации по URL

Предположим, нужно загружать разные настройки в зависимости от поддомена. Создадим маппинг доменов на файлы конфигурации.

Пример
// domain_config.php
<?php
$domain = $_SERVER['HTTP_HOST'];
$map = [
    'admin.example.com' => 'config.admin.php',
    'api.example.com' => 'config.api.php',
    'default' => 'config.default.php'
];
$configFile = __DIR__ . '/' . ($map[$domain] ?? $map['default']);
if (!file_exists($configFile)) {
    throw new \RuntimeException("Config not found for domain $domain");
}
$config = require $configFile;
print_r($config);
?>
// Вывод (если config.default.php содержит ['app_name'=>'MyApp'])
// Array ( [app_name] => MyApp )

Ошибка: если файла нет, скрипт упадёт с исключением. Решение: логировать ошибку и возвращать конфигурацию по умолчанию.

Пример 2. Конфигурация с использованием символьных ссылок

Для гибкого переключения между окружениями можно создать символическую ссылку config.php, указывающую на нужный файл.

Пример
# Создание ссылки в корне проекта
ln -s /var/www/env/prod/config.php /var/www/html/config.php
# Теперь config.php ссылается на production-конфиг.

// index.php
<?php
$config = require 'config.php';
echo $config['env']; // prod
?>
// Вывод: prod

Проблема: при деплое нужно менять ссылку, что можно автоматизировать через CI/CD. Если ссылка битая, require вызовет фатальную ошибку.

Пример 3. Использование composer autoload для загрузки конфигурации

Определить класс, который по требованию загружает конфиг из разных источников (файл, база данных, API).

Пример
// src/Config/ConfigLoader.php
<?php
namespace App\Config;

class ConfigLoader
{
    private array $config = [];
    private string $path;

    public function __construct(string $path = null)
    {
        $this->path = $path ?? dirname(__DIR__, 2) . '/config/';
    }

    public function load(string $environment = 'prod'): array
    {
        $file = $this->path . "config.$environment.php";
        if (!file_exists($file)) {
            throw new \RuntimeException("Missing config file: $file");
        }
        $this->config = require $file;
        return $this->config;
    }
}

// public/index.php
<?php
require 'vendor/autoload.php';
$loader = new \App\Config\ConfigLoader('/etc/myapp/');
$config = $loader->load('development');
print_r($config);
// Вывод: содержимое config.development.php

Ошибка: если путь неправильный, будет исключение. Рекомендуется кэшировать конфигурацию в production для ускорения.

Пример 4. Хранение конфигурации в JSON и парсинг в PHP

Иногда удобно хранить настройки в формате JSON, особенно если они обновляются динамически.

Пример
// config.json
{"db": {"host": "localhost", "port": 3306}, "app": {"debug": false}}

// load_json.php
<?php
$json = file_get_contents(__DIR__ . '/config.json');
if ($json === false) {
    die('Не удалось прочитать JSON');
}
$config = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    die('Ошибка JSON: ' . json_last_error_msg());
}
echo $config['db']['host']; // localhost
// Вывод: localhost

Проблема: отсутствие типизации и медленнее, чем PHP-массивы. Решение: сочетать с кэшированием в PHP-файл.

Расположение config.php - comments

En
Php config где (php)