【问题标题】:How can I access environment variables within a shell script called by PHP?如何在 PHP 调用的 shell 脚本中访问环境变量?
【发布时间】:2012-02-09 13:10:03
【问题描述】:

这是我在 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()

【问题讨论】:

    标签: php bash shell environment setenv


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      试试proc_open

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

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

      【讨论】:

      • 听起来可以。但是我不知道如何让脚本标准输出显示在 PHP 中。
      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 2021-12-02
          • 1970-01-01
          • 1970-01-01
          • 2011-04-26
          • 2012-04-25
          • 2012-04-26
          相关资源
          最近更新 更多