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 не установлена
// Предположим, 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. В отличие от 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 не чувствительны к регистру, в отличие от 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 и выше такое использование может вызвать предупреждение.
Расширенные примеры и сценарии
Хотя getenv() сама по себе не читает файлы, она используется в связке с библиотеками.
// Пример ручной загрузки простого .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. Часто требуется приведение типов.
$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)
$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) или внешние хранилища секретов.
$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
Доступ через объект process.env.
const dbHost = process.env.DB_HOST || 'localhost';
console.log(dbHost);
console.log(process.env.PATH);localhost /usr/local/bin:/usr/bin:/bin
Переменные окружения доступны через префикс $.
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