Способы получения значений окружения: практическое руководство для PHP

Раздел: Администрирование PHP -> Настройка окружения 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:...

Получение переменных окружения - comments

En
Get env php (php)