我正在使用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中。我希望这个问题能帮助我了解那里发生的事情。
答案 0 :(得分:0)
暂时,暂时不要在问题中涉及PHP。打开一个终端窗口;即交互式外壳。键入env
以显示所有导出的变量,即环境变量。现在键入env -i env
以在空环境中运行相同的命令。第一个env
应该显示所有预期的环境变量;例如PATH
和HOME
。第二个应该输出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有所不同。