我在使用环境变量的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继承的环境。