在运行PHP CLI脚本之前,先导出shell环境变量。

11

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

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


可能是 https://dev59.com/8EvSa4cB1Zd3GeqPbyC5 的重复问题。 - Electronick
我已经阅读了那个问题,这看起来很相似,但如果你仔细阅读,我正在询问如何实现不同的东西。 - Greg K
3个回答

9

我不完全了解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 - Greg K
根据我发布的Ubuntu链接,似乎是这样,尽管我从未这样做过。 - dldnh
谢谢,这个可行。我必须用空格分隔多个环境变量。 - Greg K
当然这个方法可行;只是很遗憾目前还没有更好的方法(至少在这里没有报道过)。 - Jonathan W.

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 ~]$ 

1

$cmd 实际上是运行一个 Ant 构建文件的命令,此脚本封装了该命令的构建过程。 - Greg K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接