php shell_exec()vs exec()
我正在努力了解shell_exec()
和exec()
之间的区别…
我一直使用exec()
来执行服务器端命令,我什么时候可以使用shell_exec()
?
shell_exec()
只是exec()
的缩写吗? 这似乎是用更less的参数相同的东西。
shell_exec
以string的forms返回所有的输出stream。 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
– 通过shell执行命令, 并以stringforms返回完整的输出
exec
– 执行一个外部程序。
与shell_exec
不同的是,您将输出作为返回值。
一些在这里没有涉及的区别:
- 用exec(),你可以传递一个可选的参数variables,它将接收一个输出行数组。 在某些情况下,这可能会节省时间,特别是如果命令的输出已经是表格。
比较:
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,那么将每行作为数组的一部分不是你想要的,因为你需要将input后处理成其他forms,所以在这种情况下使用shell_exec 。
还值得指出的是,shell_exec是用于* 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手册页所述,当您实际需要执行的命令返回代码时,您别无select,只能使用exec。