PHP shell exec () vs exec()
Я изо всех сил пытаюсь понять разницу между shell_exec() и exec()...
Я всегда использовал exec() для выполнения команд на стороне сервера, когда бы я использовал shell_exec()?
и shell_exec() просто сокращение для exec()? Это, кажется, то же самое с меньшим количеством параметров.
4 ответов:
shell_execвозвращает весь выходной поток в виде строки.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) ""обратите внимание, что использование оператор обратной связи идентичен
shell_exec().обновление: я должен объяснить, что последний. Глядя на этот ответ спустя годы, даже я не знаю, почему это вышло пустым! Даниэль объясняет это выше - это потому, что
execвозвращает только последнюю строку, аifconfigпоследняя строка оказывается пустой.
shell_exec- выполняет команду через Шелл и возвращает полный вывод в виде строки
exec- выполняет внешнюю программу.разница в том, что с
shell_execвы получаете вывод в виде возвращаемого значения.
пару различий, которые не были затронуты здесь:
- С помощью exec () вы можете передать необязательную переменную param, которая получит массив выходных строк. В некоторых случаях это может сэкономить время, особенно если вывод команд уже табличный.
сравниваем:
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, то наличие каждой строки в составе массива-это не то, что вы хотите, так как вам нужно после обработки ввода в какой-то другой форме, так что в этом случае используйте shell_exec.
также стоит отметить, что shell_exec-это псевдоним для оператора backtic, для тех, кто используется для *nix.
$out = `ls`; var_dump($out);Services также поддерживает дополнительный параметр, который будет предоставлять код возврата выполненной команды:
exec('ls', $out, $status); if (0 === $status) { var_dump($out); } else { echo "Command failed with status: $status"; }как отмечено на странице руководства shell_exec, когда вам действительно требуется код возврата от выполняемой команды, у вас нет выбора, кроме как использовать метод exec.
Comments