laravel — переменные среды PHP переносятся в дочерние процессы

У меня проблемы в 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) оба сценария должны установить переменные среды в разные значения, но дочерний процесс не видит свои собственные значения, потому что значения из родительского процесса имеют приоритет. Как я могу избежать этой проблемы и по-прежнему использовать одни и те же имена для переменных среды в обоих сценариях?

2

Решение

Перед дочерней командой env -i делает трюк. Так foo.php будет выглядеть так:

<?php
putenv('FOO=BAR');
system('env -i php ./yap.php');

Это эффективно очищает переменные окружения от контекста ребенка. Вывод теперь выглядит так:

Yap sez

Для справки, описание справочной страницы для env -i флаг (в любом случае на OSX El Capitan) говорит:

Запустите утилиту только с теми переменными среды, которые указаны в параметрах name = value. Среда, унаследованная от окр полностью игнорируется.

3

Другие решения

Других решений пока нет …