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()
?
Shell_exec()
est-il juste un raccourci pour exec()
? Cela semble être la même chose avec moins de paramètres.
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 toutes les sorties sous forme de tableau spécifié en tant que second paramètre.
Voir
Voici les différences. Notez les nouvelles lignes à 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 opérateur de backtick est identique à Shell_exec()
.
Mise à jour: Je devrais vraiment expliquer ce dernier. En regardant cette réponse des années plus tard, je ne sais même pas pourquoi cela est sorti en blanc! Daniel l'explique ci-dessus - c'est parce que exec
ne retourne que la dernière ligne et que la dernière ligne de ifconfig
est vide.
Shell_exec
- Exécute la commande via Shell et renvoie la sortie complète sous forme de chaîne
exec
- Exécute un programme externe.
La différence est qu'avec _Shell_exec
_, vous obtenez une sortie en tant que valeur de retour.
Quelques distinctions qui n'ont pas été abordées ici:
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 le résultat de la commande est xml ou json, alors vous ne souhaitez pas que chaque ligne fasse partie d'un tableau, car vous devrez post-traiter l'entrée dans un autre formulaire. Dans ce cas, utilisez Shell_exec. .
Il convient également de noter que Shell_exec est un alias pour l'opérateur backtic, pour ceux qui utilisent * 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 Shell_exec, lorsque vous avez besoin d'un code retour de la commande en cours d'exécution, vous n'avez pas d'autre choix que d'utiliser exec.