Переменные окружения в PHP: практические приёмы и примеры
Основные способы работы с переменными окружения
Как получить значение переменной окружения с помощью встроенной функции getenv()?
<?php
$dbHost = getenv('DB_HOST');
if ($dbHost === false) {
echo 'Переменная DB_HOST не определена';
} else {
echo 'Хост базы данных: ' . htmlspecialchars($dbHost);
}
?>
Isset php (функция isset() в php)
Функция getenv() возвращает значение переменной окружения по имени или false, если переменная не существует. Это базовый и наиболее эффективный способ чтения переменных, так как он не требует дополнительных настроек и работает в любой среде (CLI, веб-сервер). Цель использования: получение конфигурационных параметров, переданных из операционной системы или контейнера.
Возможные проблемы: функция возвращает false только если переменная не задана. Однако в некоторых средах (например, при использовании FastCGI) getenv() может не видеть переменные, установленные через SetEnv в Apache. Вместо этого стоит использовать $_SERVER или $_ENV. Также регистр имён важен: DB_HOST и db_host - разные переменные.
Решение: перед использованием всегда проверять результат на false и для кроссплатформенности приводить имя к верхнему регистру.
Как использовать суперглобальный массив $_ENV для доступа к переменным окружения?
<?php
echo $_ENV['APP_ENV'] ?? 'production';
?>
Php get type (получение типа переменной в php)
Массив $_ENV заполняется автоматически при выполнении скрипта, если в директиве variables_order в php.ini указана буква 'E'. Цель: единообразный доступ ко всем переменным окружения через суперглобальный массив. Удобно для использования в шаблонах.
Проблема: по умолчанию variables_order = "GPCS" (без 'E'), поэтому $_ENV может быть пустым. Ошибка: обращение к несуществующему индексу вызовет warning.
Решение: изменить variables_order на "EGPCS" или использовать filter_input(INPUT_ENV, ...) для безопасности.
Как установить временную переменную окружения с помощью putenv()?
<?php
putenv('MY_CUSTOM_VAR=my_value');
echo getenv('MY_CUSTOM_VAR'); // выведет my_value
?>
Php class variable (переменные класса в php)
Функция putenv() устанавливает переменную окружения для текущего процесса и всех его дочерних процессов. Цель: временное изменение конфигурации внутри скрипта без изменения внешнего окружения.
Проблема: в некоторых SAPIs (например, при работе через mod_php) изменения после putenv() могут не отразиться на других запросах. Также putenv() не влияет на $_ENV и $_SERVER, их нужно обновлять вручную.
Решение: после putenv() явно присвоить $_ENV['MY_CUSTOM_VAR'] = getenv('MY_CUSTOM_VAR'), если нужна синхронизация.
Как организовать конфигурацию с помощью .env файлов через библиотеку vlucas/phpdotenv?
<?php
require_once __DIR__ . '/vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
echo $_ENV['DB_HOST'] ?? getenv('DB_HOST');
?>
Php environment variable (переменные окружения в php)
Библиотека vlucas/phpdotenv загружает переменные из файла .env в $_ENV и getenv(). Цель: безопасное хранение чувствительных данных (пароли, ключи) вне кода репозитория. Используется почти во всех современных PHP-фреймворках.
Проблема: файл .env не должен попадать в репозиторий Git (добавить в .gitignore). Ошибка: если файл .env отсутствует, библиотека выбросит исключение. Также стоит использовать createImmutable для предотвращения перезаписи уже установленных переменных.
Решение: создать файл .env.example с шаблоном и инструкциями для разработчиков.
Как получить переменные окружения, установленные на уровне сервера (Apache, Nginx)?
<?php
// Apache: в .htaccess или конфиге: SetEnv APP_ENV production
echo $_SERVER['APP_ENV'];
// Nginx: fastcgi_param APP_ENV production;
echo getenv('APP_ENV');
?>
На веб-серверах переменные можно задать через директивы. Цель: разделение конфигурации между средами (development, staging, production) без изменения кода.
Проблема: разные сервера передают переменные по-разному (Apache - через SetEnv, Nginx - через fastcgi_param), и они могут быть доступны только через $_SERVER, а не через $_ENV.
Решение: проверять оба массива: $_SERVER['VAR'] ?? $_ENV['VAR'] ?? getenv('VAR') для универсальности.
<?php
// Пример 1: итерация по всем переменным окружения
foreach (getenv() as $key => $value) {
echo "$key = $value\n";
}
?>
PATH = /usr/local/bin:/usr/bin HOME = /root DB_HOST = localhost ...
Пояснение: вызов getenv() без аргументов возвращает ассоциативный массив всех доступных переменных окружения. Удобно для отладки или логирования.
<?php
// Пример 2: проверка существования переменной с заданием значения по умолчанию
function getEnvOrDefault(string $name, string $default = null): ?string {
$value = getenv($name);
return $value === false ? $default : $value;
}
echo getEnvOrDefault('APP_ENV', 'production');
?>
production
Пояснение: обёртка над getenv() безопасно возвращает значение по умолчанию, если переменная не определена.
<?php
// Пример 3: установка переменной через putenv() и проверка в подпроцессе
putenv('APP_DEBUG=true');
$output = shell_exec('echo $APP_DEBUG');
echo "Вывод shell: $output";
?>
Вывод shell: true
Пояснение: putenv() изменяет окружение для текущего процесса, и дочерние процессы (через shell_exec) наследуют эти переменные.
<?php
// Пример 4: загрузка .env файла вручную без библиотеки (упрощённо)
$lines = file(__DIR__ . '/.env', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (str_starts_with(trim($line), '#')) continue;
list($name, $value) = explode('=', $line, 2);
$name = trim($name);
$value = trim($value);
putenv("$name=$value");
$_ENV[$name] = $value;
}
// Теперь можно использовать $_ENV['DB_HOST']
echo $_ENV['DB_HOST'] ?? 'не задан';
?>
localhost
Пояснение: парсинг файла .env без внешних зависимостей. Поддерживает комментарии и пустые строки. Важно: не обрабатывает кавычки и экранирование (для продакшена лучше использовать библиотеку).
<?php
// Пример 5: фильтрация переменных с помощью filter_input
$env = filter_input(INPUT_ENV, 'APP_KEY', FILTER_SANITIZE_STRING);
if ($env === false) {
echo 'Переменная APP_KEY не найдена';
} elseif ($env === null) {
echo 'Переменная APP_KEY равна NULL';
} else {
echo "Ключ приложения: $env";
}
?>
Ключ приложения: base64:abc123...
Пояснение: filter_input() позволяет получать переменные окружения с фильтрацией, что повышает безопасность. Возвращает false, если переменная не существует.
<?php
// Пример 6: использование переменных окружения в конфигурации базы данных
$config = [
'host' => getenv('DB_HOST') ?: 'localhost',
'port' => getenv('DB_PORT') ?: 3306,
'dbname' => getenv('DB_NAME') ?: 'test',
'user' => getenv('DB_USER') ?: 'root',
'password' => getenv('DB_PASSWORD') ?: '',
];
try {
$pdo = new PDO(
"mysql:host={$config['host']};port={$config['port']};dbname={$config['dbname']}",
$config['user'],
$config['password']
);
echo 'Подключение успешно';
} catch (PDOException $e) {
echo 'Ошибка подключения: ' . $e->getMessage();
}
?>
Подключение успешно
Пояснение: типичный пример применения переменных окружения для настройки подключения к БД. Значения по умолчанию используются для локальной разработки.
<?php
// Пример 7: переменные окружения в Docker-контейнере
// В docker-compose.yml:
// environment:
// - APP_ENV=production
// В PHP:
echo 'Текущая среда: ' . (getenv('APP_ENV') ?: 'unknown');
?>
Текущая среда: production
Пояснение: Docker передаёт переменные окружения в контейнер, и PHP может их читать через стандартные функции. Это удобно для конфигурации без пересборки образа.