Getenv: примеры (PHP)

Функция getenv в PHP: полный обзор и практическое применение
Раздел: Переменные окружения
getenv(string $varname, bool $local_only = false): string|false

Описание функции getenv

Функция getenv() в PHP используется для получения значения переменной окружения операционной системы или переменной, определенной в контексте веб-сервера. Это важный инструмент для конфигурации приложений, позволяющий отделить настройки от кода, что особенно полезно в разных средах выполнения (разработка, тестирование, production).

Аргументы функции
  • name (string): Имя переменной окружения, значение которой нужно получить. Если аргумент не указан, функция вернет ассоциативный массив со всеми переменными окружения.
  • local_only (bool, PHP 7.1+): Опциональный параметр. Если установлен в true, функция будет искать переменную только в локальном окружении процесса, игнорируя переменные, полученные от SAPI (например, от веб-сервера). По умолчанию false.

Возвращаемое значение: строку (string), false если переменная не существует, или массив (array) при вызове без аргументов.

Основные примеры использования

Получение значения конкретной переменной
$path = getenv('PATH');
echo $path;
/usr/local/bin:/usr/bin:/bin
Проверка существования переменной
$dbHost = getenv('DB_HOST');
if ($dbHost !== false) {
    echo 'DB_HOST = ' . $dbHost;
} else {
    echo 'Переменная DB_HOST не установлена';
}
Переменная DB_HOST не установлена
Использование параметра local_only
// Предположим, SAPI установил переменную 'REMOTE_ADDR'
$all = getenv('REMOTE_ADDR'); // Ищет везде
$localOnly = getenv('REMOTE_ADDR', true); // Ищет только в локальном окружении процесса
var_dump($all, $localOnly);
string(9) "127.0.0.1"
bool(false)
Получение всех переменных окружения
$allEnv = getenv();
echo 'Получено переменных: ' . count($allEnv);
// Вывод одной из переменных для примера
echo 'PHP_VERSION = ' . ($allEnv['PHP_VERSION'] ?? 'не задана');
Получено переменных: 42
PHP_VERSION = 8.2.10

Похожие функции в PHP

$_SERVER и $_ENV

Доступ к переменным окружения можно получить через суперглобальные массивы $_SERVER и $_ENV. В отличие от getenv(), они содержат предзаполненные данные при условии, что в конфигурационном файле php.ini директива variables_order включает символы E (для $_ENV) и S (для $_SERVER).

Сравнение и рекомендации
  • getenv() работает всегда, независимо от настройки variables_order.
  • $_SERVER['VARIABLE_NAME'] может содержать не только переменные окружения, но и другие параметры запроса и сервера. Использование getenv() делает намерение кода более явным.
  • $_ENV напрямую соответствует переменным окружения, но может быть не заполнен по умолчанию.
  • Для конфигурации приложений часто предпочтительнее getenv() или специализированные библиотеки (vlucas/phpdotenv).

Типичные ошибки и проблемы

Неправильная проверка существования переменной

Использование операторов, трактующих false и пустую строку одинаково.

// ОШИБКА: Пустая строка и false сработают одинаково.
if (!getenv('MY_VAR')) { 
    echo 'Переменная не задана';
}
// Если MY_VAR='', скрипт также выполнит этот блок.
Переменная не задана
Правильный подход
$value = getenv('MY_VAR');
if ($value === false) {
    echo 'Переменная не существует';
} else {
    echo 'Значение: ' . $value; // может быть пустой строкой
}
Переменная не существует
Путаница с типами возвращаемых данных

Забывают, что функция без аргументов возвращает массив.

$env = getenv();
// echo $env; // Фатальная ошибка, т.к. $env - массив
echo gettype($env);
array
Проблемы с регистром имен (на Windows)

Имена переменных окружения в Windows не чувствительны к регистру, в отличие от Unix-систем.

// На Windows getenv('path') и getenv('PATH') вернут одно и то же.
// На Linux это разные переменные.

История изменений в версиях PHP

  • PHP 7.1: Добавлен необязательный параметр local_only.
  • PHP 8.0: Изменений в поведении функции не было.
  • PHP 8.1: Начало этапа устаревания (deprecation) неявного поведения приведения возвращаемого типа false к строке в контекстах, где ожидается строка (например, echo getenv('UNKNOWN_VAR')). В PHP 8.2 и выше такое использование может вызвать предупреждение.

Расширенные примеры и сценарии

Чтение конфигурации приложения из .env файла

Хотя getenv() сама по себе не читает файлы, она используется в связке с библиотеками.

Пример php
// Пример ручной загрузки простого .env файла (для иллюстрации)
$envFile = __DIR__ . '/.env';
if (file_exists($envFile)) {
    $lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    foreach ($lines as $line) {
        if (strpos(trim($line), '#') === 0) continue;
        putenv($line); // Устанавливает переменную для getenv()
    }
}
$dbName = getenv('DB_DATABASE');
echo 'База данных: ' . ($dbName !== false ? $dbName : 'не указана');
База данных: my_app_db
Использование с типизированными значениями

getenv() всегда возвращает строку или false. Часто требуется приведение типов.

Пример php
$debug = getenv('APP_DEBUG');
// Преобразование строковых значений 'true', '1', 'on' в boolean
$isDebug = filter_var($debug, FILTER_VALIDATE_BOOLEAN);
var_dump($isDebug);

$port = getenv('DB_PORT');
$portInt = (int) $port; // Явное приведение к integer
var_dump($portInt);
bool(true)
int(3306)
Динамическое формирование имени переменной
Пример php
$env = 'production';
$configKey = 'DB_HOST_' . strtoupper($env); // DB_HOST_PRODUCTION
$host = getenv($configKey);
echo $host !== false ? $host : 'Используется хост по умолчанию';
prod.db.example.com
Безопасное получение чувствительных данных

Использование getenv() для получения паролей и ключей API безопаснее, чем хранение их в коде, но сам факт установки переменной в окружении процесса может быть виден через phpinfo() или getenv(). Для дополнительной безопасности можно использовать функции вроде apache_getenv() (если используется Apache) или внешние хранилища секретов.

Пример php
$apiKey = getenv('STRIPE_API_KEY');
if ($apiKey === false) {
    throw new RuntimeException('API ключ не сконфигурирован');
}
// Далее используем $apiKey для инициализации клиента библиотеки Stripe

Аналоги в других языках

Getenv в Python

Используется функция os.environ или os.getenv(). os.environ ведет себя как словарь.

import os
path = os.getenv('PATH', 'default_value')
print(path)
# Или через словарь
print(os.environ['PATH'])
/usr/local/bin:/usr/bin:/bin
Node.js (JavaScript)

Доступ через объект process.env.

const dbHost = process.env.DB_HOST || 'localhost';
console.log(dbHost);
console.log(process.env.PATH);
localhost
/usr/local/bin:/usr/bin:/bin
Bash/Shell

Переменные окружения доступны через префикс $.

echo $PATH
echo ${DB_HOST:-localhost}  # Использование значения по умолчанию
/usr/local/bin:/usr/bin:/bin
localhost

Getenv в MySQL

Прямого аналога для переменных окружения ОС нет, но есть системные переменные сервера, которые можно получить с помощью SHOW VARIABLES или SELECT @@variable_name.

SELECT @@version;
8.0.33

PHP getenv function comments

En
Getenv Gets the value of an environment variable