2
我在使用环境变量在PHP中遇到问题,并使用诸如system()
,exec()
等之类的函数调用其中的PHP脚本。来自父进程的环境变量正在进入子进程。例如,说我有foo.php
其中包含此:将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),这两个脚本都需要将环境变量设置为不同的值,但子进程没有看到它自己的值,因为来自父进程的值优先。我怎样才能避免这个问题,并仍然在这两个脚本中的环境变量使用相同的名称?
你在说明yap.php继承foo.php,但是如果你在yap.php中设置变量会发生什么?这不是你想解决的问题吗? – miken32
PHP系统调用只需分叉当前线程,然后这个新线程进行某种exec调用。 在linux系统上,分派时,子进程继承env vars。 仍然在Linux系统上,exec只是用执行二进制代码替换旧的可执行代码。这不会改变环境变量。 这是一个预期的行为,从创建unix的位置和时间开始。 – Atrakeur
@ miken32 - 通常情况下可以工作,但由于Laravel如何加载环境变量,问题在我的案例中更加复杂。当Laravel(Artisan)脚本执行时,它显然不会覆盖执行前已经设置的环境变量。 – curtisdf