如何在PHP调用的shell脚本中访问环境变量?

时间:2012-02-09 13:10:04

标签: php bash shell environment setenv

以下是我在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()相同的行为。

4 个答案:

答案 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?