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 des commandes côté serveur, quand utiliserais-je shell_exec()
?
est-ce que shell_exec()
est juste un raccourci pour exec()
? Il semble être la même chose avec moins de paramètres.
4 réponses
shell_exec
renvoie tout le flux de sortie sous forme de chaîne. exec
renvoie la dernière ligne de la sortie par défaut, mais peut fournir tout comme la sortie d'un tableau spécifié comme second paramètre.
voir
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) ""
noter que l'utilisation du backtick operator est identique à shell_exec()
.
mise à Jour: j'ai vraiment devrait expliquer que la dernière. En regardant cette réponse des années plus tard même Je ne sais pas pourquoi c'est sorti vide! Daniel l'explique ci-dessus -- c'est parce que exec
ne renvoie que la dernière ligne, et la dernière ligne de ifconfig
est vide.
shell_exec
- exécutez la commande via le shell et retournez la sortie complète sous la forme d'une chaîne de caractères
exec
- exécutez un programme externe.
la différence est qu'avec shell_exec
vous obtenez la sortie comme une valeur de retour.
quelques distinctions qui n'ont pas été abordées ici:
- avec exec(), vous pouvez passer une variable param optionnelle qui recevra 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
inversement, si la sortie de la commande est xml ou json, alors avoir chaque ligne comme partie d'un tableau est pas ce que vous voulez, car vous aurez besoin de post-traiter l'entrée dans une autre forme, donc dans ce cas utilisez shell_exec.
il est également intéressant de souligner que shell_exec est un alias pour l'opérateur backtic, pour ceux utilisés pour *nix.
$out = `ls`;
var_dump($out);
exec supporte également un paramètre supplémentaire qui fournira le code de retour de la commande exécutée:
exec('ls', $out, $status);
if (0 === $status) {
var_dump($out);
} else {
echo "Command failed with status: $status";
}
comme indiqué dans la page de manuel de shell_exec, lorsque vous exiger un code de retour de la commande exécutée, vous n'avez pas d'autre choix que d'utiliser exec.