2015-11-06 68 views
2

我在使用环境变量在PHP中遇到问题,并使用诸如system(),exec()等之类的函数调用其中的PHP脚本。来自父进程的环境变量正在进入子进程。例如,说我有foo.php其中包含此:将PHP环境变量带入子进程

<?php 
putenv('FOO=BAR'); 
system('php ./yap.php'); 

而在同一文件夹中我有yap.php其中包含此:

<?php 
echo "Yap sez " . getenv('FOO') . "\n"; 

如果我跑php foo.php,我得到这个:

Yap sez BAR 

这不应该!在现实生活中(Laravel),这两个脚本都需要将环境变量设置为不同的值,但子进程没有看到它自己的值,因为来自父进程的值优先。我怎样才能避免这个问题,并仍然在这两个脚本中的环境变量使用相同的名称?

+0

你在说明yap.php继承foo.php,但是如果你在yap.php中设置变量会发生什么?这不是你想解决的问题吗? – miken32

+2

PHP系统调用只需分叉当前线程,然后这个新线程进行某种exec调用。 在linux系统上,分派时,子进程继承env vars。 仍然在Linux系统上,exec只是用执行二进制代码替换旧的可执行代码。这不会改变环境变量。 这是一个预期的行为,从创建unix的位置和时间开始。 – Atrakeur

+0

@ miken32 - 通常情况下可以工作,但由于Laravel如何加载环境变量,问题在我的案例中更加复杂。当Laravel(Artisan)脚本执行时,它显然不会覆盖执行前已经设置的环境变量。 – curtisdf

回答

3

env -i之前的子女命令是诀窍。所以foo.php应该是这样的:

<?php 
putenv('FOO=BAR'); 
system('env -i php ./yap.php'); 

这有效地从孩子的情况下清除环境变量。输出现在看起来像:

Yap sez 

作为参考,为env -i标志手册页描述(在OSX埃尔卡皮坦反正)说:

仅name指定的环境变量执行程序=值选项。完全忽略由env继承的环境。