从PHP CLI脚本运行命令之前导出shell环境变量

时间:2012-03-09 15:28:08

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

我有一个使用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脚本的子进程?

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

3 个答案:

答案 0 :(得分:5)

我不是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")

答案 1 :(得分:2)

您可以将变量分配前置为$ 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 :(得分:1)

有几件事情浮现在脑海中。一个是$ cmd是一个脚本,它包含运行实际程序之前的环境变量设置。

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

DISPLAY=host:0.0 xclock

但我不知道在passthru

的背景下是否有效

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