1

这是我在 Apaches VirtualHost 容器中设置变量的方法

SetEnv MY_VAR "/opt/"

现在,PHP 可以完美地访问这个变量:

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

但是,如果我从我的 PHP 代码中调用 shell 脚本

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()相同的行为。

4

4 回答 4

1

尝试proc_open

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

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

于 2012-02-09T13:26:27.590 回答
1

如果您使用putenv("MY_VAR=test");环境值,则会将其传递给调用的 shell 命令。(但它没有放入$_ENV

所以你可以简单地做类似的事情

foreach ( $_SERVER as $k=>$v ) putenv("$k=$v");
于 2012-02-09T13:31:31.770 回答
1

如果您在第一页中使用 phpinfo(),您将看到您的 env 变量 (MY_VAR) 未列在“环境”框中,而是列在“Apache 环境”中(如果这是您使用的网络服务器)。

因此,似乎“getenv”不仅从环境中获取它的值,而且还从 Apache 环境中获取它的值,当通过 passthru 启动某些东西时,它(似乎)没有被继承。

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

因此,对于要导出到 passthru 脚本的每个变量,您应该使用:

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

使用数组和 for 循环很容易做到。

于 2012-02-09T13:38:44.367 回答
0

我想这是因为当您调用 SetEnv 时,您正在修改当前的 shell 环境。当您随后调用 passthru 时,您现有的 env 与任何未导出的变量一起被破坏,并且为 /path/to/myscript 提供了一个“新鲜”环境。

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

于 2012-02-09T13:23:12.223 回答