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

Использование putenv для управления окружением в PHP
Раздел: Переменные окружения
putenv(string $assignment): bool

Функция putenv в PHP

Функция putenv() предназначена для установки значения переменной окружения в текущем процессе выполнения скрипта. Она изменяет или добавляет переменные в окружении, которое наследуется дочерними процессами.

Область применения

Использование функции актуально при конфигурации среды выполнения для внешних программ, библиотек, настройки параметров системы, временного изменения переменных окружения для тестирования или управления поведением приложения.

Синтаксис и аргументы

Сигнатура функции: bool putenv(string $assignment)

Параметр $assignment принимает строку в формате "NAME=value" для установки переменной NAME со значением value. Для удаления переменной используется строка "NAME" (без знака равенства) или "NAME=".

Функция возвращает true при успешном выполнении и false при возникновении ошибки.

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

Установка переменной окружения

putenv("APP_ENV=production");
echo getenv('APP_ENV');
production
Изменение существующей переменной

putenv("TMP=/new/tmp/dir");
echo getenv('TMP');
/new/tmp/dir
Удаление переменной

putenv('MYVAR'); // или putenv("MYVAR=")
var_dump(getenv('MYVAR'));
bool(false)
Попытка установки без значения

$result = putenv("SOMEVAR");
var_dump($result);
echo getenv('SOMEVAR');
bool(true)

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

В PHP существуют альтернативные способы работы с окружением.

$_ENV суперглобальный массив

Массив $_ENV содержит переменные окружения, установленные в среде выполнения. В отличие от putenv(), изменения в $_ENV не влияют на фактическое окружение процесса.

Функция getenv() используется для получения значения переменной окружения. Часто применяется вместе с putenv().

apache_setenv()

При работе с Apache модулем, функция apache_setenv() устанавливает переменные окружения специфичные для Apache. Она более предпочтительна в контексте веб-сервера.

Выбор функции

putenv() используют для изменения окружения на уровне процесса. $_ENV подходит для чтения и внутренней передачи параметров. apache_setenv() применяют в конфигурации веб-сервера.

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

Putenv в Python

Модуль os предоставляет словарь environ и функцию putenv(). Изменения через os.environ автоматически отражаются на окружении.


import os
os.environ['DB_HOST'] = 'localhost'
print(os.environ['DB_HOST'])
localhost
Node.js (JavaScript)

В Node.js объект process.env содержит переменные окружения. Изменения объекта влияют на текущий процесс.


process.env.NODE_ENV = 'development';
console.log(process.env.NODE_ENV);
development

Putenv в MySQL

В MySQL не существует прямой аналогии, так как это СУБД. Однако системные переменные настраиваются через оператор SET, что концептуально похоже.

Отличия от PHP

В Python и Node.js переменные окружения представлены в виде объектов словаря, что упрощает манипуляции. PHP использует строковый параметр, что требует более внимательной обработки формата.

Типичные ошибки

Некорректный формат строки

Передача строки без знака равенства устанавливает переменную без значения, что может привести к неожиданному поведению.


putenv('INCORRECT_FORMAT');
echo getenv('INCORRECT_FORMAT') === false ? 'false' : 'true';
true
Попытка изменения защищенных переменных

Некоторые переменные окружения могут быть защищены операционной системой, и их изменение приведет к ошибке.


$result = putenv('PATH=');
var_dump($result);
bool(false)
Использование в веб-среде

Установленные через putenv() переменные действуют только в рамках текущего запроса и не сохраняются между запросами.


// В первом запросе
putenv('REQUEST_ID=123');
// Во втором запросе
echo getenv('REQUEST_ID');

Изменения в PHP 8

В PHP 8.1.0 функция putenv() стала более строгой к формату параметра. Строка, не содержащая знака равенства =, теперь устанавливает переменную с пустым значением, что соответствует удалению переменной.

В версии PHP 8.2.0 улучшена совместимость с многопоточными средами выполнения, где изменения переменных окружения стали более предсказуемыми.

Ранее, в PHP 7.1.0, функция стала выдавать ошибку уровня E_WARNING при некорректном формате строки, что помогает в отладке.

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

Динамическая конфигурация внешней программы

Использование putenv() для настройки окружения перед запуском внешнего процесса через proc_open().

Пример php

putenv('LANG=en_US.UTF-8');
putenv('MAX_SIZE=1024');

$descriptorspec = [
    0 => ['pipe', 'r'],
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w']
];

$process = proc_open('env', $descriptorspec, $pipes);
if (is_resource($process)) {
    echo stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    proc_close($process);
}
LANG=en_US.UTF-8
MAX_SIZE=1024
...
Временное изменение для тестирования

Временная установка переменной с сохранением предыдущего значения для последующего восстановления.

Пример php

$oldTmp = getenv('TMPDIR');
putenv('TMPDIR=/custom/tmp');

// Код, использующий TMPDIR

echo getenv('TMPDIR');

// Восстановление
if ($oldTmp !== false) {
    putenv('TMPDIR=' . $oldTmp);
} else {
    putenv('TMPDIR');
}
/custom/tmp
Массовая установка переменных из массива

Эффективная установка нескольких переменных окружения из ассоциативного массива.

Пример php

$envVars = [
    'CACHE_DRIVER' => 'redis',
    'LOG_LEVEL' => 'debug',
    'TIMEOUT' => '30'
];

foreach ($envVars as $name => $value) {
    putenv($name . '=' . $value);
}

// Проверка
foreach (array_keys($envVars) as $name) {
    echo $name . ': ' . getenv($name) . '
';
}
CACHE_DRIVER: redis
LOG_LEVEL: debug
TIMEOUT: 30
Использование с расширениями

Некоторые расширения PHP, например, для работы с графикой или базами данных, используют переменные окружения для своей конфигурации.

Пример php

// Установка домашнего директория для Oracle Instant Client
putenv('LD_LIBRARY_PATH=/opt/oracle/instantclient');
putenv('NLS_LANG=AMERICAN_AMERICA.AL32UTF8');
// Результат не отображается, но влияет на поведение расширения

PHP putenv function comments

En
Putenv Sets the value of an environment variable