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