PHP shell exec () vs exec()
Staram się zrozumieć różnicę między shell_exec()
i exec()
...
Zawsze używałem exec()
do wykonywania poleceń po stronie serwera, kiedy powinienem użyć shell_exec()
?
Czy shell_exec()
to tylko skrót exec()
? Wydaje się to być to samo z mniejszymi parametrami.
4 answers
shell_exec
zwraca cały strumień wyjściowy jako ciąg znaków. exec
domyślnie zwraca ostatnią linię wyjścia, ale może dostarczyć wszystkie wyjście jako tablicę określoną jako drugi parametr.
Zobacz
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 22:39:15
Oto różnice. Zwróć uwagę na nowe linie na końcu.
> shell_exec('date')
string(29) "Wed Mar 6 14:18:08 PST 2013\n"
> exec('date')
string(28) "Wed Mar 6 14:18:12 PST 2013"
> shell_exec('whoami')
string(9) "mark\n"
> exec('whoami')
string(8) "mark"
> shell_exec('ifconfig')
string(1244) "eth0 Link encap:Ethernet HWaddr 10:bf:44:44:22:33 \n inet addr:192.168.0.90 Bcast:192.168.0.255 Mask:255.255.255.0\n inet6 addr: fe80::12bf:ffff:eeee:2222/64 Scope:Link\n UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1\n RX packets:16264200 errors:0 dropped:1 overruns:0 frame:0\n TX packets:7205647 errors:0 dropped:0 overruns:0 carrier:0\n collisions:0 txqueuelen:1000 \n RX bytes:13151177627 (13.1 GB) TX bytes:2779457335 (2.7 GB)\n"...
> exec('ifconfig')
string(0) ""
Zauważ, że użycie operatora backtick jest identyczne z shell_exec()
.
Update: naprawdę powinienem wyjaśnić to ostatnie. Patrząc na tę odpowiedź wiele lat później nawet nie wiem, dlaczego to wyszło puste! Daniel wyjaśnia to powyżej - to dlatego, że exec
zwraca tylko ostatnią linię, a ifconfig
Ostatnia linia jest pusta.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-31 23:18:08
shell_exec
- Wykonaj polecenie za pomocą powłoki i zwróć pełne wyjście jako ciąg znaków
exec
- Uruchom zewnętrzny program.
Różnica polega na tym, że z shell_exec
otrzymujesz wynik jako wartość zwracaną.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-14 11:14:25
Kilka wyróżnień, które nie zostały tu poruszone:
- z exec (), możesz przekazać opcjonalną zmienną param, która otrzyma tablicę linii wyjściowych. W niektórych przypadkach może to zaoszczędzić czas, zwłaszcza jeśli wyjście poleceń jest już tabelaryczne.
Porównaj:
exec('ls', $out);
var_dump($out);
// Look an array
$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it
Odwrotnie, jeśli wyjściem polecenia jest xml lub json, to posiadanie każdej linii jako części tablicy nie jest tym, czego chcesz, ponieważ będziesz musiał przetworzyć dane wejściowe do innych form, więc w takim przypadku użyj shell_exec.
Warto również zwrócić uwagę, że shell_exec jest aliasem dla operatora backtic, dla tych, które są używane do *nix.
$out = `ls`;
var_dump($out);
Exec obsługuje również dodatkowy parametr, który dostarczy kod powrotu z wykonanego polecenia:
exec('ls', $out, $status);
if (0 === $status) {
var_dump($out);
} else {
echo "Command failed with status: $status";
}
Jak zauważono na stronie podręcznika shell_exec, kiedy faktycznie wymagasz kodu zwrotnego z wykonywanego polecenia, nie masz innego wyboru niż użyć exec.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-30 18:54:58