2012-02-09 43 views
1

这是我如何设置我的阿帕奇虚拟主机容器内的变量现在如何在由PHP调用的shell脚本中访问环境变量?

SetEnv MY_VAR "/opt/" 

,PHP可以完全访问此vairable:

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

但是,如果我把一个shell脚本从我的PHP代码

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

MY_VAR/path/to/myscript内为空。

如果我不过修改这样的通话,它的工作原理:

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

有没有更好的方式来所有环境变量传递给shell脚本?因为我需要通过多个。

我也试过system(),exec(),反引号和shell_exec()。它们都显示相同的行为,如passthru()

回答

1

如果使用putenv("MY_VAR=test");,则会将环境值传递给调用的shell命令。 (但不要放在$_ENV

所以,你可以简单地做这样的事情

foreach ($_SERVER as $k=>$v) putenv("$k=$v"); 
+0

这工作:-) Thx。 – JochenJung 2012-02-09 13:43:39

0

我想这是因为当你调用SetEnv时,你正在修改当前的shell环境。当你随后调用passthru时,你现有的env会与任何非导出的变量一起被销毁,并且给/ path/to/myscript一个“新鲜”的环境。

您可以在命令行上将env变量作为参数传递给/ path/to/myscript -MY_VAR =/opt吗?

1

尝试proc_open

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

您可以传递一个包含环境变量的数组作为选项。

+0

听起来像它会工作。不过,我无法确定,我如何获得PHP中显示的脚本标准输出。 – JochenJung 2012-02-09 13:49:44

1

如果您在第一页用phpinfo(),你会看到你的环境变量(MY_VAR)不列在“环境”框中,但在“Apache环境”中(如果这是您使用的Web服务器)。

因此,似乎“getenv”不仅从环境中获取它的值,而且从Apache环境中获得它的值,这似乎在通过passthru启动某些东西时不会被继承。

在由passthru执行的脚本中,我只能看到env。在“环境”框中列出的变量,因此是一致的。

所以,你要导出到中继脚本每个变量,你应该使用:

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

易与阵列和一个for循环做。

相关问题