以下是我在Apaches VirtualHost容器中设置变量的方法
SetEnv MY_VAR "/opt/"
现在,PHP可以完美地访问这个可用的:
echo $_SERVER['MY_VAR'];
/opt/
但是,如果我从PHP代码中调用shell脚本
passthru('/path/to/myscript');
{p} MY_VAR
在/path/to/myscript
内为空。
如果我修改这样的调用,它可以工作:
passthru('export MY_VAR='. $_SERVER['MY_VAR'] .'; /path/to/myscript');
有没有更好的方法将所有环境变量传递给shell脚本?因为我需要传递多个。
我还尝试了system(),exec(),反叛和shell_exec()。它们都表现出与passthru()相同的行为。
答案 0 :(得分:1)
尝试proc_open。
proc_open('/path/to/myscript', $descriptorspec, $pipes, null, $_SERVER);
您可以传递一个包含环境变量的数组作为选项。
答案 1 :(得分:1)
如果使用putenv("MY_VAR=test");
,则会将环境值传递给调用的shell命令。 (但它没有放入$_ENV
)
所以你可以简单地做一些像
这样的事情foreach ( $_SERVER as $k=>$v ) putenv("$k=$v");
答案 2 :(得分:1)
如果您在第一页中使用phpinfo(),您将看到您的env变量(MY_VAR)未列在“环境”框中,但在“Apache环境”中(如果这是您使用的网络服务器)
因此,似乎“getenv”不仅从环境中获取其值,而且还从Apache环境中获取其值,这似乎在通过passthru启动时不会继承。
在passthru执行的脚本中,我只看到env。 vars列在“环境”框中,因此它是一致的。
因此,对于要导出到passthru脚本的每个变量,您应该使用:
putenv('MY_VAR ='.apache_getenv('MY_VAR'));
使用数组和for循环很容易。
答案 3 :(得分:0)
我想这是因为当你调用SetEnv时,你正在修改你当前的shell环境。当您随后调用passthru时,您的现有env将与任何未导出的变量一起销毁,并且/ path / to / myscript将提供“新鲜”环境。
您是否可以在命令行上传递env变量,作为参数/ path / to / myscript -MY_VAR = / opt?