У меня проблемы в PHP с переменными окружения, и я вызываю другие скрипты PHP внутри них, используя такие функции, как system()
, exec()
и тому подобное. Переменные среды из родительского процесса переносятся в дочерние процессы. Например, скажем, у меня есть foo.php
который содержит это:
<?php
putenv('FOO=BAR');
system('php ./yap.php');
И в той же папке у меня есть yap.php
который содержит это:
<?php
echo "Yap sez " . getenv('FOO') . "\n";
Если я бегу php foo.php
Я получаю это:
Yap sez BAR
Этого не должно быть! В реальной жизни (Laravel) оба сценария должны установить переменные среды в разные значения, но дочерний процесс не видит свои собственные значения, потому что значения из родительского процесса имеют приоритет. Как я могу избежать этой проблемы и по-прежнему использовать одни и те же имена для переменных среды в обоих сценариях?
Перед дочерней командой env -i
делает трюк. Так foo.php
будет выглядеть так:
<?php
putenv('FOO=BAR');
system('env -i php ./yap.php');
Это эффективно очищает переменные окружения от контекста ребенка. Вывод теперь выглядит так:
Yap sez
Для справки, описание справочной страницы для env -i
флаг (в любом случае на OSX El Capitan) говорит:
Запустите утилиту только с теми переменными среды, которые указаны в параметрах name = value. Среда, унаследованная от окр полностью игнорируется.
Других решений пока нет …