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),两个脚本都需要将环境变量设置为不同的值,但是子进程看不到自己的值,因为来自父进程的值是优先考虑。我怎样才能避免这个问题并在两个脚本中仍然使用相同的环境变量名称?
在 child 命令之前加上 env -i
就可以了。所以 foo.php
看起来像这样:
<?php
putenv('FOO=BAR');
system('env -i php ./yap.php');
这有效地从 child 的上下文中清除了环境变量。输出现在看起来像:
Yap sez
作为参考,env -i
标志的手册页描述(无论如何在 OSX El Capitan 上)说:
Execute the utility with only those environment variables specified by name=value options. The environment inherited by env is ignored completely.
我在使用 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),两个脚本都需要将环境变量设置为不同的值,但是子进程看不到自己的值,因为来自父进程的值是优先考虑。我怎样才能避免这个问题并在两个脚本中仍然使用相同的环境变量名称?
在 child 命令之前加上 env -i
就可以了。所以 foo.php
看起来像这样:
<?php
putenv('FOO=BAR');
system('env -i php ./yap.php');
这有效地从 child 的上下文中清除了环境变量。输出现在看起来像:
Yap sez
作为参考,env -i
标志的手册页描述(无论如何在 OSX El Capitan 上)说:
Execute the utility with only those environment variables specified by name=value options. The environment inherited by env is ignored completely.