@@ -304,19 +304,16 @@ public function start(callable $callback = null/*, array $env = array()*/)
304
304
$ inheritEnv = true ;
305
305
}
306
306
307
- $ envBackup = array ();
308
307
if (null !== $ env && $ inheritEnv ) {
309
- foreach ($ env as $ k => $ v ) {
310
- $ envBackup [$ k ] = getenv ($ k );
311
- putenv (false === $ v || null === $ v ? $ k : "$ k= $ v " );
312
- }
313
- $ env = null ;
308
+ $ env += $ this ->getDefaultEnv ();
314
309
} elseif (null !== $ env ) {
315
310
@trigger_error ('Not inheriting environment variables is deprecated since Symfony 3.3 and will always happen in 4.0. Set "Process::inheritEnvironmentVariables()" to true instead. ' , E_USER_DEPRECATED );
311
+ } else {
312
+ $ env = $ this ->getDefaultEnv ();
316
313
}
317
314
if ('\\' === DIRECTORY_SEPARATOR && $ this ->enhanceWindowsCompatibility ) {
318
315
$ this ->options ['bypass_shell ' ] = true ;
319
- $ commandline = $ this ->prepareWindowsCommandLine ($ commandline , $ envBackup , $ env );
316
+ $ commandline = $ this ->prepareWindowsCommandLine ($ commandline , $ env );
320
317
} elseif (!$ this ->useFileHandles && $ this ->enhanceSigchildCompatibility && $ this ->isSigchildEnabled ()) {
321
318
// last exit code is output on the fourth pipe and caught to work around --enable-sigchild
322
319
$ descriptors [3 ] = array ('pipe ' , 'w ' );
@@ -332,10 +329,6 @@ public function start(callable $callback = null/*, array $env = array()*/)
332
329
333
330
$ this ->process = proc_open ($ commandline , $ descriptors , $ this ->processPipes ->pipes , $ this ->cwd , $ env , $ this ->options );
334
331
335
- foreach ($ envBackup as $ k => $ v ) {
336
- putenv (false === $ v ? $ k : "$ k= $ v " );
337
- }
338
-
339
332
if (!is_resource ($ this ->process )) {
340
333
throw new RuntimeException ('Unable to launch a new process. ' );
341
334
}
@@ -1623,7 +1616,7 @@ private function doSignal($signal, $throwException)
1623
1616
return true ;
1624
1617
}
1625
1618
1626
- private function prepareWindowsCommandLine ($ cmd , array &$ envBackup , array & $ env = null )
1619
+ private function prepareWindowsCommandLine ($ cmd , array &$ env )
1627
1620
{
1628
1621
$ uid = uniqid ('' , true );
1629
1622
$ varCount = 0 ;
@@ -1636,7 +1629,7 @@ private function prepareWindowsCommandLine($cmd, array &$envBackup, array &$env
1636
1629
[^"%!^]*+
1637
1630
)++
1638
1631
) | [^"]*+ )"/x ' ,
1639
- function ($ m ) use (&$ envBackup , & $ env , &$ varCache , &$ varCount , $ uid ) {
1632
+ function ($ m ) use (&$ env , &$ varCache , &$ varCount , $ uid ) {
1640
1633
if (!isset ($ m [1 ])) {
1641
1634
return $ m [0 ];
1642
1635
}
@@ -1654,13 +1647,7 @@ function ($m) use (&$envBackup, &$env, &$varCache, &$varCount, $uid) {
1654
1647
$ value = '" ' .preg_replace ('/( \\\\*)"/ ' , '$1$1 \\" ' , $ value ).'" ' ;
1655
1648
$ var = $ uid .++$ varCount ;
1656
1649
1657
- if (null === $ env ) {
1658
- putenv ("$ var= $ value " );
1659
- } else {
1660
- $ env [$ var ] = $ value ;
1661
- }
1662
-
1663
- $ envBackup [$ var ] = false ;
1650
+ $ env [$ var ] = $ value ;
1664
1651
1665
1652
return $ varCache [$ m [0 ]] = '! ' .$ var .'! ' ;
1666
1653
},
@@ -1728,4 +1715,27 @@ private function escapeArgument($argument)
1728
1715
1729
1716
return '" ' .str_replace (array ('" ' , '^ ' , '% ' , '! ' , "\n" ), array ('"" ' , '"^^" ' , '"^%" ' , '"^!" ' , '!LF! ' ), $ argument ).'" ' ;
1730
1717
}
1718
+
1719
+ private function getDefaultEnv ()
1720
+ {
1721
+ if (\PHP_VERSION_ID >= 70100 ) {
1722
+ $ env = getenv ();
1723
+ } else {
1724
+ $ env = array ();
1725
+
1726
+ foreach ($ _SERVER as $ k => $ v ) {
1727
+ if (is_string ($ v ) && false !== $ v = getenv ($ k )) {
1728
+ $ env [$ k ] = $ v ;
1729
+ }
1730
+ }
1731
+ }
1732
+
1733
+ foreach ($ _ENV as $ k => $ v ) {
1734
+ if (is_string ($ v )) {
1735
+ $ env [$ k ] = $ v ;
1736
+ }
1737
+ }
1738
+
1739
+ return $ env ;
1740
+ }
1731
1741
}
0 commit comments