web-dev-qa-db-fra.com

PHP exec () vs system () vs passthru ()

Quelles sont les différences?

Existe-t-il une situation ou une raison spécifique pour chaque fonction? Si oui, pouvez-vous donner quelques exemples de ces situations?

PHP.net dit qu'ils sont utilisés pour exécuter des programmes externes. voir référence D'après les exemples que je vois, je ne vois aucune différence évidente.

Si je devais simplement exécuter un script (bash ou python), quelle fonction me recommanderiez-vous d'utiliser?

299
codingbear

Ils ont des buts légèrement différents.

  • exec() est utilisé pour appeler une commande système et éventuellement gérer la sortie vous-même.
  • system() permet d'exécuter une commande système et d'afficher immédiatement le résultat - vraisemblablement du texte.
  • passthru() est destiné à l'exécution d'une commande système dont vous souhaitez obtenir le retour brut - vraisemblablement quelque chose de binaire.

Quoi qu'il en soit, je vous suggère de ne pas en utiliser. Ils produisent tous du code très instable.

182
Kalium

Tiré de http://php.net/ && Chipmunkninja :

La fonction system ()

La fonction système dans PHP prend un argument de chaîne avec la commande à exécuter, ainsi que tous les arguments que vous souhaitez transmettre à cette commande. Cette fonction exécute la commande spécifiée et vide le texte résultant dans le flux de sortie (soit la sortie HTTP dans une situation de serveur Web, soit la console si vous exécutez PHP en tant qu'outil de ligne de commande). Le retour de cette fonction est la dernière ligne de sortie du programme, s'il émet une sortie texte.

La fonction exec ()

La fonction système est très utile et puissante, mais l’un des plus gros problèmes est que tout le texte résultant du programme est envoyé directement au flux de sortie. Dans certains cas, vous voudrez peut-être formater le texte résultant et l'afficher d'une manière différente, ou ne pas l'afficher du tout.

Pour cela, la fonction exec dans PHP est parfaitement adaptée. Au lieu de vider automatiquement tout le texte généré par le programme en cours d'exécution dans le flux de sortie, vous avez la possibilité de placer ce texte dans un tableau renvoyé dans le second paramètre de la fonction:

La fonction Shell_exec ()

La plupart des programmes que nous avons exécutés jusqu'à présent étaient plus ou moins de vrais programmes1. Cependant, l’environnement dans lequel travaillent les utilisateurs Windows et Unix est beaucoup plus riche que cela. Les utilisateurs Windows ont la possibilité d’utiliser le programme Invite de commandes Windows, cmd.exe. Ce programme est appelé une commande Shell.

La fonction passthru ()

Une fonction fascinante que PHP fournit des fonctions similaires à celles que nous avons vues jusqu'à présent est la fonction passthru. Cette fonction, comme les autres, exécute le programme que vous lui dites. Cependant, il envoie ensuite immédiatement la sortie brute de ce programme au flux de sortie avec lequel PHP fonctionne actuellement (c'est-à-dire soit HTTP dans un scénario de serveur Web, soit le shell dans une version en ligne de commande de PHP ).

Le proc_open () Fonction et popen () fonction

proc_open () est similaire à popen () mais offre un degré de contrôle beaucoup plus important sur l'exécution du programme. cmd est la commande à exécuter par le shell. descriptorspec est un tableau indexé dans lequel la clé représente le numéro du descripteur et la valeur indique comment PHP transmettra ce descripteur au processus enfant. Les pipes seront définies sur un tableau indexé de pointeurs de fichiers correspondant à la fin de PHP des pipes créés. La valeur de retour est une ressource représentant le processus; vous devriez le libérer en utilisant proc_close () lorsque vous avez fini.

122
Dinesh Saini

Les réponses précédentes semblent toutes un peu déroutantes ou incomplètes, alors voici un tableau des différences ...

+----------------+-----------------+----------------+----------------+
|    Command     | Displays Output | Can Get Output | Gets Exit Code |
+----------------+-----------------+----------------+----------------+
| system()       | Yes (as text)   | Last line only | Yes            |
| passthru()     | Yes (raw)       | No             | Yes            |
| exec()         | No              | Yes (array)    | Yes            |
| Shell_exec()   | No              | Yes (string)   | No             |
| backticks (``) | No              | Yes (string)   | No             |
+----------------+-----------------+----------------+----------------+
  • "Affiche la sortie" signifie qu'il transmet la sortie au navigateur (ou à la ligne de commande si elle est exécutée à partir d'une ligne de commande).
  • "Peut obtenir une sortie" signifie que vous pouvez obtenir la sortie de la commande et l'assigner à une variable PHP.
  • Le "code de sortie" est une valeur spéciale renvoyée par la commande (également appelée "état de retour"). Zéro signifie généralement que l'opération a réussi. Les autres valeurs sont généralement des codes d'erreur.

Autres choses à prendre en compte:

  • Shell_exec () et l'opérateur backticks font la même chose.
  • Il existe également proc_open () et popen () qui vous permettent de lire/écrire de manière interactive des flux à l'aide d'une commande en cours d'exécution.
  • Ajoutez "2> & 1" à la chaîne de commande si vous souhaitez également capturer/afficher les messages d'erreur.
  • Utilisez escapeshellcmd () pour échapper aux arguments de commande pouvant contenir des caractères posant problème.
  • Si vous passez une variable $ output à exec () pour stocker la sortie, si $ output n'est pas vide, il y ajoutera la nouvelle sortie. Donc, vous devrez peut-être désélectionner ($ sortie) en premier.
81
orrd

Tout dépend de la manière dont vous voulez gérer la sortie que la commande peut renvoyer et du fait que vous souhaitiez que votre script PHP attende que le programme appelé se termine ou non.

  • exec exécute une commande et transmet la sortie à l'appelant (ou la renvoie dans une variable facultative).

  • passthru est similaire à la fonction exec() en ce sens qu'elle exécute une commande. Cette fonction doit être utilisée à la place de exec() ou system() lorsque la sortie de la commande Unix contient des données binaires qui doivent être renvoyées directement au navigateur.

  • system exécute un programme externe et affiche la sortie, mais uniquement la dernière ligne.

Si vous devez exécuter une commande et faire en sorte que toutes les données de la commande soient directement renvoyées sans aucune interférence, utilisez la fonction passthru().

18
Cody Caughlan

Si vous exécutez votre script PHP à partir de la ligne de commande, passthru() présente un avantage considérable. Il vous permettra d'exécuter des scripts/programmes tels que vim, dialog, etc., en laissant ces programmes gérer le contrôle et revenir à votre script uniquement lorsqu'ils sont terminés.

Si vous utilisez system() ou exec() pour exécuter ces scripts/programmes, cela ne fonctionnera tout simplement pas.

Gotcha: Pour une raison quelconque, vous ne pouvez pas exécuter less avec passthru() en PHP.

6
Matt