PHP环境变量带入子进程


PHP environment variables carrying over into child processes

我在使用环境变量的PHP时遇到了问题,并且在使用system()exec()等函数时调用了其中的其他PHP脚本。父进程中的环境变量被转移到子进程中。例如,假设我有foo.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),两个脚本都需要将环境变量设置为不同的值,但子进程看不到自己的值,因为父进程的值优先。如何避免这个问题,并且在两个脚本中仍然使用相同的环境变量名称?

在子命令前面加env -i就可以了。所以foo.php看起来是这样的:

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

这样可以有效地从子对象的上下文中清除环境变量。现在的输出看起来像:

Yap sez 

作为参考,env -i标志的手册页描述(无论如何都在OSX El Capitan上)说:

只使用name=value选项指定的那些环境变量来执行实用程序。完全忽略env继承的环境。