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 содержит переменные окружения, установленные в среде выполнения. В отличие от putenv(), изменения в $_ENV не влияют на фактическое окружение процесса.
Функция getenv() используется для получения значения переменной окружения. Часто применяется вместе с putenv().
При работе с 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 объект process.env содержит переменные окружения. Изменения объекта влияют на текущий процесс.
process.env.NODE_ENV = 'development';
console.log(process.env.NODE_ENV);
development
Putenv в MySQL
В MySQL не существует прямой аналогии, так как это СУБД. Однако системные переменные настраиваются через оператор SET, что концептуально похоже.
В 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().
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 ...
Временная установка переменной с сохранением предыдущего значения для последующего восстановления.
$oldTmp = getenv('TMPDIR');
putenv('TMPDIR=/custom/tmp');
// Код, использующий TMPDIR
echo getenv('TMPDIR');
// Восстановление
if ($oldTmp !== false) {
putenv('TMPDIR=' . $oldTmp);
} else {
putenv('TMPDIR');
}
/custom/tmp
Эффективная установка нескольких переменных окружения из ассоциативного массива.
$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, например, для работы с графикой или базами данных, используют переменные окружения для своей конфигурации.
// Установка домашнего директория для Oracle Instant Client
putenv('LD_LIBRARY_PATH=/opt/oracle/instantclient');
putenv('NLS_LANG=AMERICAN_AMERICA.AL32UTF8');
// Результат не отображается, но влияет на поведение расширения