Как я могу получить доступ к переменным окружения в скрипте оболочки, называемом PHP? - PullRequest
1 голос
/ 09 февраля 2012

Вот как я устанавливаю переменную в своем контейнере Apache VirtualHost

SetEnv MY_VAR "/opt/"

Теперь PHP может получить полный доступ к этой переменной:

echo $_SERVER['MY_VAR'];
/opt/

Однако, если я вызываю скрипт оболочкииз моего PHP-кода

passthru('/path/to/myscript');

MY_VAR пуст в /path/to/myscript.

Если я, однако, изменю вызов так, он будет работать:

passthru('export MY_VAR='. $_SERVER['MY_VAR'] .'; /path/to/myscript');

Есть ли лучший способ передать все переменные окружения в сценарий оболочки?Так как мне нужно передать несколько.

Я также попытался system () , exec () , backticks и shell_exec () .Все они показывают то же поведение, что и passthru () .

Ответы [ 4 ]

1 голос
/ 09 февраля 2012

Если вы используете phpinfo () на первой странице, вы увидите, что ваша переменная env (MY_VAR) указана не в поле «Environment», а в «Apache Environment» (если это веб-сервер, который вы используете) .

Таким образом, кажется, что "getenv" получает не только свои значения из среды, но и из среды Apache, которая (кажется) не наследуется при запуске чего-либо passthru.

В сценарии, выполненном passthru, я вижу только env. Переменные указаны в поле «Environment», поэтому оно соответствует.

Итак, для каждой переменной, которую вы хотите экспортировать в сценарий passthru, вы должны использовать:

putenv('MY_VAR ='.apache_getenv('MY_VAR'));

Легко сделать с массивом и циклом for.

1 голос
/ 09 февраля 2012

Попробуйте proc_open .

proc_open('/path/to/myscript', $descriptorspec, $pipes, null, $_SERVER);

Вы можете передать массив с переменными окружения в качестве опции.

1 голос
/ 09 февраля 2012

Если вы используете putenv("MY_VAR=test");, значение среды передается в вызванную команду оболочки.(но он не вставляется в $_ENV)

Так что вы можете просто сделать что-то вроде

foreach ( $_SERVER as $k=>$v ) putenv("$k=$v");
0 голосов
/ 09 февраля 2012

Полагаю, это потому, что когда вы вызываете SetEnv, вы модифицируете текущую среду оболочки.Когда вы впоследствии, когда вы вызываете passthru, ваш существующий env уничтожается вместе с любыми неэкспортированными переменными и «свежей» средой, переданной /path/to/myscript.

Можете ли вы вместо этого передать переменные env в командув качестве параметров к / path / to / myscript -MY_VAR = / opt?

...