Редактировать: насколько я могу судить, мой вопрос из-за дефекта в PHP. Я скопировал этот вопрос на трекер ошибок PHP здесь: https://bugs.php.net/bug.php?id=74143 и планирую попробовать и реализовать исправление.Как использовать putenv() для обновления существующей переменной среды?
Функция PutEnv устанавливает значение переменной окружения. Согласно руководству, putenv возвращает true при успехе, false при ошибке.
Однако я обнаружил, что функция putenv иногда возвращает true без обновления переменной среды для текущего сеанса.
Чтобы воспроизвести эту проблему, установите переменную среды на веб-сервере с помощью PHP FPM, используя директиву fastcgi_param. Это невероятно полезно, так как позволяет настраивать переменные среды отдельно от других хостов на одном сервере.
Пример nginx.conf:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_param TESTVAR_ENV old-value;
include fastcgi_params;
}
Пример test.php:
var_dump(getenv("TESTVAR_ENV"));
var_dump(putenv("TESTVAR_ENV=new-value"));
var_dump(getenv("TESTVAR_ENV"));
Выход test.php:
string(12) "old-value"
bool(true)
string(12) "old-value"
Как вы можете видеть:
- существующее значение считывается getenv успешно,
- Функция putenv возвращает true, указывая на успех,
- новое значение фактически не установлено, что невероятно сбивает с толку.
Я не понимаю, какова цель функции putenv? Есть ли недостающая документация на странице руководства setenv? Как использовать putenv() для обновления существующей переменной среды?
Я не видел такого поведения себя. Вы пытались сначала удалить старое значение? 'putenv (" TESTVAR_ENV ")' должен очистить значение или попробовать вместо этого использовать '$ _SERVER'? – miken32
На самом деле, просто протестировал это с помощью Nginx и PHP-FPM, вместо CLI, и я вижу то же самое. – miken32
Считаете ли вы, что это ошибка с PHP или PHP-FPM? – Greg