带入子进程的PHP环境变量

带入子进程的PHP环境变量,php,laravel,child-process,Php,Laravel,Child Process,我在PHP中遇到了环境变量方面的问题,并使用诸如system()、exec()之类的函数调用了其中的其他PHP脚本。来自父进程的环境变量被带入子进程。例如,假设我有foo.php,其中包含以下内容: <?php putenv('FOO=BAR'); system('php ./yap.php'); <?php echo "Yap sez " . getenv('FOO') . "\n"; 如果我运行php foo.php,我会得到以下结果: Yap sez BAR 这不应该!在

我在PHP中遇到了环境变量方面的问题,并使用诸如
system()
exec()
之类的函数调用了其中的其他PHP脚本。来自父进程的环境变量被带入子进程。例如,假设我有
foo.php
,其中包含以下内容:

<?php
putenv('FOO=BAR');
system('php ./yap.php');
<?php
echo "Yap sez " . getenv('FOO') . "\n";
如果我运行
php foo.php
,我会得到以下结果:

Yap sez BAR

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

在子命令前面加上
env-I
就可以解决这个问题。所以
foo.php
看起来像这样:

<?php
putenv('FOO=BAR');
system('env -i php ./yap.php');
作为参考,env-i标志的手册页说明(在OSX El Capitan上)显示:

仅使用name=value选项指定的环境变量执行该实用程序。env继承的环境被完全忽略


您正在演示yap.php继承foo.php,但是如果在yap.php中设置变量会发生什么?这不是您想要解决的问题吗?PHP系统调用只是将当前线程分叉,然后这个新线程进行某种exec调用。在linux系统上,分叉时,子进程继承env vars。仍然在linux系统上,exec只是将旧的可执行代码替换为已执行二进制文件中的代码。这不会更改环境变量。这是从unix创建的时间和地点开始的预期行为。@miken32-通常这会起作用,但在我的例子中,由于Laravel如何加载环境变量,问题更复杂。当执行Laravel(Artisan)脚本时,它显然不会覆盖执行前已设置的环境变量。感谢@Atrakeur的解释。这是有道理的,但我不希望PHP环境变量通过shell从PHP泄漏到另一个PHP进程中。我一直认为他们在范围上更受限制。
Yap sez