Где хранить config.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 в общем автозагрузчике.
Расширенные примеры работы с расположением 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-файл.