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

Quelles sont les différences?

y a-t-il une situation ou une raison particulière 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 conseillez-vous d'utiliser?

283
demandé sur jww 2009-04-09 08:44:15

5 réponses

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

  • exec() est pour appeler une commande de système, et peut-être traiter la sortie vous-même.
  • system() sert à exécuter une commande système et à afficher immédiatement la sortie - probablement du texte.
  • passthru() est pour exécuter une commande de système que vous souhaitez le retour brut de - probablement quelque chose de binaire.

quoi qu'il en soit, je vous conseille de ne pas les utiliser. Ils produisent tous du code très peu important.

171
répondu Kalium 2017-07-27 05:49:37

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

Le system() Fonction

la fonction système en PHP prend un argument string avec la commande exécuter ainsi que tous les arguments que vous souhaitez transmis à la commande. Ce la fonction exécute la commande spécifiée, et vide tout texte résultant à la sortie stream (soit la sortie HTTP dans un serveur web) situation, ou la console si vous utilisez PHP comme ligne de commande outil.) Le retour de cette fonction est la dernière ligne de la sortie de l' programme, s'il émet une sortie de texte.

Le exec() Fonction

la fonction de système est très utile et puissant, mais l'un des les plus gros problèmes c'est que tout le texte du programme va directement au flux de sortie. Il y aura des situations où vous pourrait vouloir formater le texte résultant et l'afficher dans certains de façon différente, ou ne pas l'afficher du tout.

pour cela, la fonction exec en PHP est parfaitement adaptée. Plutôt automatiquement dumping tout le texte généré par le programme exécuté pour le flux de sortie, il vous donne la possibilité de mettre ce texte dans un tableau retourné dans le second paramètre à la fonction:

Le shell_exec() Fonction

la Plupart des programmes que nous avons mené jusqu'à présent ont été, plus ou moins, de vrais programmes1. Toutefois, L'environnement dans lequel les fenêtres et Les utilisateurs d'Unix exploitent est en fait beaucoup plus riche que cela. Les utilisateurs de Windows vous avez la possibilité d'utiliser le programme Prompt de la commande Windows, cmd.EXE Ce programme est connu sous le nom de shell de commande.

Le passthru () fonction

une fonction fascinante que PHP fournit similaire à ceux que nous avons vu jusqu'ici est la fonction passthru. Cette fonction, comme les autres, exécute le programme vous le dire. Cependant, il procède ensuite à envoyer immédiatement la sortie brute de ce programme au flux de sortie avec lequel PHP travaille actuellement (C'est-à-dire soit HTTP dans un serveur web scénario, ou le shell en ligne de commande la version de PHP).

Le proc_open() "151920920 de la Fonction" et popen() fonction

proc_open() est similaire à popen (), mais fournit un plus grand degré de contrôle sur l'exécution du programme. cmd est la commande à exécutée par le shell. descriptorspec est un tableau indexé où key représente le nombre de descripteurs et la valeur représente comment PHP va passer ce descripteur le processus de l'enfant. les tuyaux seront mis à un tableau indexé de pointeurs de fichier qui correspondent à la fin de PHP de n'importe quel les tuyaux qui sont créés. La valeur de retour est une ressource représentant le processus; vous devriez le libérer en utilisant proc_close () lorsque vous êtes fini avec elle.

107
répondu Dinesh Saini 2018-05-07 16:57:43

La précédente répondu semblaient tous être un peu confuse ou incomplète, voici donc 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             |
+----------------+-----------------+----------------+----------------+
  • "affichage de sortie" renvoie la sortie vers le navigateur (ou la sortie en ligne de commande si elle est exécutée à partir d'une ligne de commande).
  • "Can Get Output" signifie que vous pouvez obtenir la sortie de la commande et l'affecter à une variable PHP.
  • "code de sortie" est une valeur spéciale renvoyé par la commande (également appelée "état de retour"). Zéro signifie habituellement qu'il a réussi et les autres valeurs sont habituellement des codes d'erreur.

Autres misc de choses à connaître:

  • le shell_exec() et l'opérateur backticks font la même chose.
  • il y a aussi proc_open() et popen() qui vous permettent de lire/écrire de manière interactive les flux avec une commande d'exécution.
  • Ajouter "2>&1" à la commande string si vous voulez aussi capturer/Afficher des messages d'erreur.
  • utilisez escapeshellcmd() pour échapper aux arguments de commande qui peuvent contenir des caractères de 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ésactiver($output) en premier.
66
répondu orrd 2017-03-29 17:32:00

tout se résume à la façon dont vous voulez gérer la sortie que la commande pourrait retourner et si vous voulez que votre script PHP attende que le programme callee finisse ou non.

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

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

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

si vous avez besoin d'exécuter une commande et avoir toutes les données de la commande passé directement en arrière sans aucune interférence, utiliser la fonction passthru() .

17
répondu Cody Caughlan 2015-11-09 14:33:57

si vous utilisez votre script PHP depuis la ligne de commande, passthru() a un grand avantage. Il vous permettra d'exécuter des scripts / programmes tels que vim , dialog , etc, en laissant ces programmes gérer le contrôle et le retour à votre script seulement quand ils sont faits.

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.

5
répondu Matt 2015-09-18 18:25:36