Переменные окружения в PHP: практические приёмы и примеры

Раздел: Основы 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 может их читать через стандартные функции. Это удобно для конфигурации без пересборки образа.

Переменные окружения в PHP - comments

En
Php environment variable (php)