Способы получения значений окружения: практическое руководство для PHP
Основные методы получения переменных окружения
Как получить значение конкретной переменной окружения в PHP?
Функция getenv() является прямым и наиболее эффективным способом чтения переменных окружения. Она принимает имя переменной в виде строки и возвращает её значение, либо false, если переменная не определена.
<?php
$dbHost = getenv('DB_HOST');
if ($dbHost === false) {
$dbHost = 'localhost';
}
echo $dbHost;
?>
Php не является внутренней или внешней командой (php не является внутренней или внешней командой)
Пояснение: Код проверяет, определена ли переменная DB_HOST. Если нет, подставляется значение по умолчанию. Важно использовать строгое сравнение с false, так как пустая строка тоже может быть корректным значением.
Типичные проблемы:
- Регистрозависимость на Linux. Переменная DB_HOST и db_host - разные.
- Пустая строка vs false. Если переменная объявлена, но пуста, getenv() вернёт пустую строку, а не false.
- В некоторых окружениях (например, при работе через CGI) переменные могут быть недоступны, если не настроен соответствующий SAPI.
Как получить все переменные окружения одновременно?
Вызов getenv() без аргументов или с null возвращает ассоциативный массив всех доступных переменных окружения. Это удобно для отладки или проверки наличия множества параметров.
<?php
$env = getenv();
echo '<pre>' . print_r($env, true) . '</pre>';
?>
Php could not find driver (ошибка "could not find driver" в php)
Результат: вывод всех пар «ключ => значение» из окружения процесса PHP.
Проблема: Получение всего окружения может раскрыть чувствительные данные (пароли, ключи API). Не рекомендуется выводить массив в production-среде.
Как использовать суперглобальный массив $_ENV?
PHP сохраняет переменные окружения в суперглобальном массиве $_ENV, если в директиве variables_order присутствует буква «E». Этот способ аналогичен getenv(), но может не отражать изменения, внесённые во время выполнения с помощью putenv().
<?php
// php.ini: variables_order = "EGPCS" (E - среда)
echo $_ENV['PATH'] ?? 'Переменная не найдена';
?>
Get env php (получение переменных окружения)
Пояснение: Массив $_ENV заполняется один раз при старте PHP. Для получения переменных, установленных позже (например, через putenv()), необходимо использовать getenv().
Ошибка: Если variables_order не включает «E», $_ENV будет пуст. Проверить текущее значение можно через phpinfo().
Как получить переменные окружения через $_SERVER?
Некоторые переменные окружения дублируются в массиве $_SERVER, особенно если PHP работает как модуль веб-сервера. Например, SERVER_NAME или HTTP_HOST могут быть полезны, но это не универсальный способ чтения произвольных переменных.
<?php
// Доступ к переменной окружения через $_SERVER
echo $_SERVER['HOME'] ?? 'HOME не определён';
?>
Usr share php (путь usr/share/php)
Этот вариант работает только для тех переменных, которые переданы веб-сервером в CGI-окружение. Для целенаправленного получения пользовательских переменных лучше применять getenv().
Недостаток: Не все переменные окружения попадают в $_SERVER, и их имена могут отличаться. Надёжность подхода ниже.
Как читать переменные из .env файла без внешних библиотек?
Многие проекты хранят окружение в файлах .env. Стандартная функция parse_ini_file() не подходит, так как формат .env не является INI-совместимым. Один из способов - написать простой парсер.
<?php
function loadEnv(string $path): void {
$lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (str_starts_with(trim($line), '#')) {
continue;
}
[$key, $value] = explode('=', $line, 2);
$key = trim($key);
$value = trim($value);
// Удаление кавычек, если есть
if ((str_starts_with($value, '"') && str_ends_with($value, '"')) ||
(str_starts_with($value, "'") && str_ends_with($value, "'"))) {
$value = substr($value, 1, -1);
}
putenv("$key=$value");
$_ENV[$key] = $value;
}
}
loadEnv(__DIR__ . '/.env');
echo getenv('APP_KEY');
?>
Этот код загружает переменные из .env и делает их доступными через getenv() и $_ENV. Работает только для простых значений без многострочных строк.
Проблема: При частом использовании такого самодельного парсера легко допустить ошибки (экранирование, комментарии, пробелы). Для production-решений рекомендуется использовать библиотеку vlucas/phpdotenv.
Расширенные примеры работы с переменными окружения
Пример 1. Фильтрация и приведение типов при получении переменной
Часто требуется получить не просто строку, а число или булево значение. Следующий код демонстрирует безопасное преобразование.
<?php
function getEnvInt(string $name, int $default = 0): int {
$value = getenv($name);
if ($value === false || $value === '') {
return $default;
}
return (int)$value;
}
$maxConnections = getEnvInt('DB_MAX_CONNECTIONS', 10);
echo $maxConnections;
?>
Вывод: 10 (если переменная не установлена) или число из окружения.
Пример 2. Установка и чтение переменной в рамках одного скрипта (putenv и getenv)
Функция putenv() позволяет временно задать переменную окружения, которая затем читается через getenv(). Это полезно для тестирования или настройки зависимых библиотек.
<?php
// Устанавливаем переменную окружения
putenv('CUSTOM_VAR=my_value');
// Считываем её
echo getenv('CUSTOM_VAR'); // my_value
// Удаляем переменную
putenv('CUSTOM_VAR');
echo getenv('CUSTOM_VAR'); // false
?>
my_value (пустая строка)
Пример 3. Получение переменных окружения внутри Docker-контейнера
При запуске контейнера через docker run -e переменные автоматически становятся доступны в PHP. Код внутри контейнера:
<?php
// Переменная передана как -e APP_ENV=production
echo 'Application environment: ' . getenv('APP_ENV');
?>
Application environment: production
Важно: в Docker Compose переменные можно задавать в секции environment или через файл .env, который автоматически считывается.
Пример 4. Сравнение поведения getenv() в CLI и веб-окружении
В командной строке скрипт наследует окружение текущего пользователя. При запуске через веб-сервер (например, Apache mod_php) переменные могут отличаться. Пример проверки:
<?php
$cliUser = getenv('USER'); // для CLI - имя пользователя
$serverName = getenv('SERVER_NAME'); // для веб - часто отсутствует
echo "CLI user: $cliUser\n";
echo "Server name: $serverName";
?>
При запуске из консоли: CLI user: root Server name: При запуске через браузер: CLI user: www-data (или пусто) Server name: localhost
Пример 5. Использование getenv() с библиотекой phpdotenv для чтения .env
Библиотека vlucas/phpdotenv считается стандартом де-факто. После установки через Composer загружает файл и делает переменные доступными через getenv().
<?php
require_once __DIR__ . '/vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
// Теперь getenv('DB_PASSWORD') вернёт значение из .env
echo 'Пароль БД: ' . getenv('DB_PASSWORD');
?>
Пароль БД: secret123
Пример 6. Получение переменной с проверкой наличия в нескольких источниках
Иногда нужно проверить сначала getenv(), затем $_ENV и $_SERVER, и вернуть первое найденное значение. Это обеспечивает максимальную совместимость.
<?php
function getEnvRobust(string $name, $default = null) {
$value = getenv($name);
if ($value !== false) {
return $value;
}
if (isset($_ENV[$name])) {
return $_ENV[$name];
}
if (isset($_SERVER[$name])) {
return $_SERVER[$name];
}
return $default;
}
echo getEnvRobust('PATH');
?>
/usr/local/sbin:/usr/local/bin:...