PHP环境变量转入子进程

时间:2015-11-06 04:38:28

标签: php laravel child-process

我在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),两个脚本都需要将环境变量设置为不同的值,但子进程没有看到自己的值,因为来自父进程的值优先。如何避免此问题,并且仍然在两个脚本中对环境变量使用相同的名称?

1 个答案:

答案 0 :(得分:3)

使用env -i之前的子命令可以解决这个问题。所以foo.php看起来像这样:

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

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

Yap sez 

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

  

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