【问题标题】:export shell environment variable before running command from PHP CLI script在从 PHP CLI 脚本运行命令之前导出 shell 环境变量
【发布时间】:2012-03-27 01:18:13
【问题描述】:

我有一个使用passthru() 运行命令的脚本。在运行这个命令之前我需要设置一些shell环境变量,否则它会找不到它的库。

我尝试了以下方法:

putenv("LD_LIBRARY_PATH=/path/to/lib");
passthru($cmd);

使用putenv() 似乎不会传播到我正在运行的命令。它没有说它找不到它的库。当我在 bash 中运行 export LD_LIBRARY_PATH=/path/to/lib 时,它运行良好。

我还尝试了以下方法(徒劳):

exec("export LD_LIBRARY_PATH=/path/to/lib");
passthru($cmd);

如何从 PHP 中设置一个 shell 变量,以传播到我的 PHP 脚本的子进程?

我是否仅限于检查当前环境中是否不存在变量并要求用户手动设置它?

【问题讨论】:

  • 我读过那个问题,这看起来很相似,但如果你读过,我想问的是如何实现不同的目标。

标签: php environment-variables command-line-interface


【解决方案1】:

你可以在 $cmd 前面加上你的变量赋值。

[ghoti@pc ~]$ cat doit.php 
<?php

$cmd='echo "output=$FOO/$BAR"';

$cmd="FOO=bar;BAR=baz;" . $cmd;

print ">> $cmd\n";
passthru($cmd);

[ghoti@pc ~]$ php doit.php 
>> FOO=bar;BAR=baz;echo "output=$FOO/$BAR"
output=bar/baz
[ghoti@pc ~]$ 

【讨论】:

    【解决方案2】:

    我不是 100% 熟悉 PHP 的 exec 是如何工作的,但你尝试过吗:exec("LD_LIBRARY_PATH=/path/to/lib $cmd")

    我知道这在大多数 shell 中都有效,但我不确定 PHP 是如何工作的。

    编辑:假设这是有效的,处理多个变量只需用空格分隔它们:

    exec("VAR1=val1 VAR2=val2 LD_LIBRARY_PATH=/path/to/lib $cmd")

    【讨论】:

    • 如果我有多个变量? MYVAR=value; LD_LIBRARY_PATH=/path/to/lib $cmd ?
    • 似乎,至少根据我发布的 ubuntu 链接,虽然我从来没有这样做过
    • 谢谢,这行得通。我不得不分隔多个环境变量。
    【解决方案3】:

    我想到了几件事。一种是 $cmd 是一个脚本,在运行实际程序之前包含环境变量设置。

    另一个想法是这样的:我知道你可以定义一个变量并在同一行运行一个程序,例如:

    DISPLAY=host:0.0 xclock
    

    但我不知道这是否适用于passthru

    https://help.ubuntu.com/community/EnvironmentVariables#Bash.27s_quick_assignment_and_inheritance_trick

    【讨论】:

    • $cmd 实际上是一个运行 ant 构建文件的命令,这个脚本包装了该命令的构建。
    最近更新 更多