Я пытаюсь понять разницу между shell_exec()
и exec()
...
Я всегда использовал exec()
для выполнения команд на стороне сервера, когда я использовал бы shell_exec()
?
Является ли shell_exec()
сокращением для exec()
? Это похоже на то, что с меньшим количеством параметров.
shell_exec
возвращает весь выходной поток в виде строки. exec
возвращает последнюю строку вывода по умолчанию, но может предоставить весь вывод в качестве массива, заданного как второй параметр.
См
exec()
может [делать] все, что shell_exec()
[может,] и многое другое :) »
Вот отличия. Обратите внимание на новые строки в конце.
> 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) ""
Обратите внимание, что использование оператора backtick идентично shell_exec()
.
Обновление: Я действительно должен объяснить это последнее. Глядя на этот ответ спустя годы, я даже не знаю, почему это получилось пустым! Даниэль объясняет это выше, потому что exec
возвращает только последнюю строку, а ifconfig
последняя строка оказывается пустой.
2>&1
в конец вашей команды, чтобы перенаправить STDERR в STDOUT, если вы находитесь на машине с Linux.
shell_exec
- выполнить команду через оболочку и вернуть полный вывод в виде строки
exec
- выполнить внешнюю программу.
Разница в том, что с shell_exec
вы получаете выход как возвращаемое значение.
exec
возвращает последнюю строку вывода. При желании вы можете при желании передать массив в качестве второго параметра для получения полного вывода и целое число в качестве третьего параметра для получения возвращаемого значения команды оболочки, которое можно использовать для проверки ошибок. Самым большим недостатком shell_exec
является то, что он возвращает shell_exec
, если команда не выполняется, ИЛИ, если она не shell_exec
никаких выходных данных, поэтому ее возвращаемое значение нельзя надежно использовать для проверки ошибок.
Пара различий, которые здесь не были затронуты:
Для сравнения:
exec('ls', $out);
var_dump($out);
// Look an array
$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it
И наоборот, если вывод команды - xml или json, то каждая строка как часть массива не то, что вы хотите, так как вам нужно будет обработать ввод в какой-либо другой форме, поэтому в этом case use shell_exec.
Также стоит отметить, что shell_exec является псевдонимом для backtic-оператора, для тех, которые используются для * nix.
$out = `ls`;
var_dump($out);
exec также поддерживает дополнительный параметр, который предоставит код возврата из выполненной команды:
exec('ls', $out, $status);
if (0 === $status) {
var_dump($out);
} else {
echo "Command failed with status: $status";
}
Как указано на странице руководства shell_exec, когда вам действительно нужен код возврата из исполняемой команды, у вас нет выбора, кроме как использовать exec.
exec
позволяет получить код возврата команды (через параметр &$return_var
), а shell_exec
предоставляет способа его получения.
date
,whoami
,ifconfig
,netstat
.