web-dev-qa-db-ja.com

PHP Shell_exec()対exec()

Shell_exec()exec()...の違いを理解するのに苦労しています。

私はいつもexec()を使用してサーバーサイドのコマンドを実行しましたが、いつShell_exec()を使用するのですか。

Shell_exec()exec()の単なる略記ですか?それはより少ないパラメータで同じことのようです。

313
Webnet

Shell_execはすべての出力ストリームを文字列として返します。 execはデフォルトで出力の最後の行を返しますが、2番目のパラメータとして指定された配列としてすべての出力を提供できます。

見る

324
Daniel A. White

違いはここにあります。最後の改行に注意してください。

> 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の最後の行が空白であることが起こるからです。

69
mpen

Shell_exec - Shell を介してコマンドを実行し、完全な出力を文字列として返します

exec - 外部プログラムを実行します。

違いは、Shell_execでは戻り値として出力されるということです。

48
J0HN

ここでは触れていないいくつかの違い

  • 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は* 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を使用する以外に選択肢はありません。

35
gview