web-dev-qa-db-fra.com

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()?

Shell_exec() est-il juste un raccourci pour exec()? Cela semble être la même chose avec moins de paramètres.

321
Webnet

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

331
Daniel A. White

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.

69
mpen

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.

48
J0HN

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 en sortie. Dans certains cas, cela peut faire gagner du temps, en particulier si le résultat 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 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.

35
gview