2010-01-04 87 views
5

我试图设置一个应该可以从PHP外部访问的变量。理想情况下,这应该是一个局部变量,但环境变量也是受欢迎的。将一个变量从PHP导出到shell

首先,我已经试过putenv(),但没有给出结果:

$ PHP -r “运行putenv( 'PHP_TEST =字符串');” ;回声$ PHP_TEST

$

当我打电话getenv()来自同一个脚本 - 它导致了正确的 '字符串' 值。 安全模式是关闭的,但手册上说“PHP_”前缀与安全至关重要=,所以我使用它,以防万一:)

然后我尝试system()shell_exec()

$ PHP -r “了shell_exec( 'PHP_TEST =串');” ; echo $ PHP_TEST

$ php -r“shell_exec('export PHP_TEST = string');” ;回声$ PHP_TEST

$

有没有解决办法?可能是什么原因? 我使用Ubuntu Linux 9.10“Karmic”,但FreeBSD服务器提供了相同的结果。

回答

3

如果你想传递一些输出到shell变量,你可以做这样的:

$ testvar=$(php -r 'print "hello"') 
$ echo $testvar 
hello 

显示出口如何影响的事情:

$ php -r '$a=getenv("testvar"); print $a;' 
$ export testvar 
$ php -r '$a=getenv("testvar"); print $a;' 
hello 

在这些例子中,交互式shell是父进程,显示的所有内容都是一个孩子(以及彼此的兄弟姐妹)。

+0

谢谢!这使问题清楚。但是,那么'getopt'(以及其他一些非内置程序)如何设法将变量导出到外部环境? (例如'getopt' exports'$ OPTIND') – kolypto 2010-01-05 01:59:23

+0

你混淆了外部的'/ usr/bin/getopt',它不会和内建的'getopts'不能做到这一点。 – 2010-01-05 02:49:14

2

导出的环境变量只能在子进程中使用。

所以你可以设置一个环境变量,然后产生一个子进程。环境变量将在该子进程中可见。但是,将其设置为php,然后启动后续进程(在上例中为echo)将不起作用。

如果你设置了变量,然后产生/ exec一个新的进程,它应该在新进程中可见。