PHP exec / passthru添加环境变量

时间:2019-05-16 14:11:00

标签: php shell environment-variables

我正在使用clear_env = yes(默认)运行php-fpm。

确实

echo getenv('PATH');

什么都不输出。

但是,

passthru('set');

输出:

HOME='/'
HOSTNAME='pod-ed3f8236c1-g3ksb'
IFS='     
'
LINENO=''
OPTIND='1'
PATH='/sbin:/usr/sbin:/bin:/usr/bin'
PPID='203'
PS1='\w \$ '
PS2='> '
PS4='+ '
PWD='/app/www'
SHLVL='1'
USER='nobody'

那些环境变量来自哪里?

我将实际问题放入another question中。我希望这个问题能帮助我了解那里发生的事情。

1 个答案:

答案 0 :(得分:0)

暂时,暂时不要在问题中涉及PHP。打开一个终端窗口;即交互式外壳。键入env以显示所有导出的变量,即环境变量。现在键入env -i env以在空环境中运行相同的命令。第一个env应该显示所有预期的环境变量;例如PATHHOME。第二个应该输出nothin,表明env -i实际上已经删除了所有环境变量。现在键入env -i bash -c set。哇!这些变量都是什么,它们是从哪里来的?

部分答案是shell的set命令不仅仅显示env vars。它显示了在Shell的执行上下文中定义的所有var。现在执行env -i bash -c env。那将只显示由外壳创建的环境变量。请注意,列表要短得多。特别要注意的是,bash -c set列出了类似PATH的变量,而bash -c env却没有。这是因为,尽管shell定义了默认的PATH,以便其功能达到最低限度,但它并没有自动导出该var。

执行passthru('set');时,您执行的操作与在shell提示符下键入bash -c set的操作大致相同。那不仅仅显示env vars。我之所以说“或多或少”,是因为实际上php可能是在“幕后”做sh -c set,而sh的行为将与bash,ksh或zsh等其他shell有所不同。