396 votes

php shell_exec () vs exec ()

J'ai du mal à comprendre la différence entre shell_exec() et exec() ...

J'ai toujours utilisé exec() pour exécuter les commandes côté serveur, quand devrais-je utiliser shell_exec() ?

Est-ce que shell_exec() n'est qu'un raccourci pour exec() ? Cela semble être la même chose avec moins de paramètres.

393voto

Daniel A. White Points 91889

shell_exec renvoie tout le flux de sortie sous la forme d'une chaîne. exec renvoie la dernière ligne de la sortie.

Voir

87voto

Mark Points 49079

Voici les différences. Note les retours à la ligne à la fin.

> 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) ""

Notez que l'utilisation de la backtick opérateur est identique à shell_exec().

Mise à jour: j'ai vraiment devrait expliquer que la dernière. En regardant cette réponse ans plus tard même, je ne sais pas pourquoi c'est sorti en blanc!!! Daniel explique ci-dessus -- c'est parce qu' exec seulement renvoie la dernière ligne, et ifconfigs'dernière ligne arrive à être vide.

54voto

J0HN Points 10486

shell_exec - Exécute la commande via shell et renvoie la sortie complète sous la forme d'une chaîne

exec - Exécute un programme externe.

La différence est qu'avec shell_exec vous obtenez une valeur de retour.

43voto

gview Points 5419

Un couple de distinctions qui n'ont pas abordé ici:

  • Avec exec(), vous pouvez passer d'une option param variable qui va recevoir un tableau de lignes de sortie. Dans certains cas, cela pourrait économiser du temps, surtout si la sortie des commandes est déjà tabulaire.

Comparer:

exec('ls', $out);
var_dump($out);
// Look an array

$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it

A l'inverse, si la sortie de la commande est de type xml ou json, puis d'avoir chaque ligne d'un tableau n'est pas ce que vous voulez, tant que vous aurez besoin de post-traitement à l'entrée dans une autre forme, donc dans ce cas utiliser shell_exec.

Il est également intéressant de souligner que shell_exec est un alias de la backtic opérateur, pour ceux qui sont utilisés pour *nix.

$out = `ls`;
var_dump($out);

1voto

bon exemple pour voir les différences est d'essayer ces commandes: date , whoami , ifconfig , netstat .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X