Jeśli uruchomię to polecenie unix bezpośrednio w powłoce:
$ sleep 100 &
uśpienie działa w tle zgodnie z oczekiwaniami i mogę kontynuować pracę w linii poleceń.
ale próbując tego samego z shell_exec () i php otrzymuję różne wyniki.
<?php
$sleep = $argv[1];
$shell="sleep " . $sleep . " &";
shell_exec($shell);
?>
podczas wykonywania php sleep.php 100
linia poleceń zawiesza się i nie akceptuje więcej poleceń, aż do zakończenia snu. Nie jestem pewien, czy jest to niuans, którego brakuje mi shell_exec()
/ $argv
php lub z powłoką unix.
Dzięki.
Odpowiedzi:
3 dla odpowiedzi № 1The shell_exec
funkcja próbuje przechwycić wyjście polecenia, którego nie może wykonać, jednocześnie kontynuując przetwarzanie. W rzeczywistości, jeśli spojrzysz na kod źródłowy php, php shell_exec
funkcja robi popen
Wywołanie C, które wykonuje wait
syscall w poleceniu. wait
gwarantuje, że podproces nie wróci, dopóki dziecko nie opuści.