346 Stimmen

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

Was sind die Unterschiede?

Gibt es eine bestimmte Situation oder einen bestimmten Grund für jede Funktion? Wenn ja, können Sie einige Beispiele für diese Situationen nennen?

PHP.net sagt, dass sie zur Ausführung externer Programme verwendet werden. siehe Referenz Bei den Beispielen, die ich sehe, kann ich keinen offensichtlichen Unterschied erkennen.

Wenn ich einfach ein Skript (Bash oder Python) ausführen möchte, welche Funktion empfehlen Sie mir dann?

217voto

Kalium Punkte 4574

Sie haben einen etwas anderen Zweck.

  • exec() dient dazu, einen Systembefehl aufzurufen und eventuell die Ausgabe selbst zu bearbeiten.
  • system() dient dazu, einen Systembefehl auszuführen und die Ausgabe - vermutlich Text - sofort anzuzeigen.
  • passthru() ist für die Ausführung eines Systembefehls gedacht, von dem Sie die unbearbeitete Rückmeldung wünschen - vermutlich etwas Binäres.

Unabhängig davon schlage ich vor, dass Sie keines davon verwenden. Sie alle produzieren höchst unportablen Code.

162voto

orrd Punkte 8591

Die bisherigen Antworten scheinen alle ein wenig verwirrend oder unvollständig zu sein, deshalb hier eine Tabelle mit den Unterschieden...

+----------------+-----------------+----------------+----------------+
|    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             |
+----------------+-----------------+----------------+----------------+
  • "Zeigt die Ausgabe an" bedeutet, dass die Ausgabe in den Browser gestreamt wird (oder in die Befehlszeile, wenn sie von einer Befehlszeile aus ausgeführt wird).
  • "Can Get Output" bedeutet, dass Sie die Ausgabe des Befehls abrufen und einer PHP-Variablen zuweisen können.
  • Der "Exit-Code" ist ein spezieller Wert, den der Befehl zurückgibt (auch "Rückgabestatus" genannt). Null bedeutet normalerweise, dass der Befehl erfolgreich war, andere Werte sind normalerweise Fehlercodes.

Weitere Kleinigkeiten, die zu beachten sind:

  • Der Operator shell_exec() und der Operator backticks tun dasselbe.
  • Es gibt auch proc_open() und popen(), die es Ihnen ermöglichen, Streams interaktiv zu lesen/schreiben, indem Sie einen Befehl ausführen.
  • Fügen Sie "2>&1" zum Befehlsstring hinzu, wenn Sie auch Fehlermeldungen erfassen/anzeigen wollen.
  • Verwenden Sie escapeshellcmd(), um Befehlsargumente zu entschlüsseln, die Problemzeichen enthalten können.
  • Wenn eine $output-Variable an exec() übergeben wird, um die Ausgabe zu speichern, wird die neue Ausgabe an sie angehängt, wenn $output nicht leer ist. Sie müssen also möglicherweise zuerst unset($output) löschen.

142voto

Dinesh Saini Punkte 2853

Wie aus http://php.net/ && Chipmunkninja :

En system() Funktion

Die Systemfunktion in PHP tak auszuführenden Befehl sowie alle Argumente, die Sie an diesen Befehl übergeben möchten. Diese Funktion führt den angegebenen Befehl aus und gibt den resultierenden Text in den Ausgabestrom (entweder die HTTP-Ausgabe in einem Webserver Situation oder die Konsole, wenn Sie PHP als Kommandozeilenprogramm Werkzeug benutzen). Der Rückgabewert dieser Funktion ist die letzte Zeile der Ausgabe des Programms, wenn es eine Textausgabe ausgibt.

En exec() Funktion

Die Systemfunktion ist sehr nützlich und leistungsfähig, aber eine der größten Probleme dabei ist, dass der gesamte vom Programm erzeugte Text direkt in den Ausgabestrom geht. Es wird Situationen geben, in denen Sie den resultierenden Text formatieren und auf eine andere Art und Weise anzeigen möchten anders oder gar nicht anzeigen möchten.

Hierfür ist die exec-Funktion in PHP perfekt geeignet. Anstatt automatisch den gesamten vom ausgeführten Programm erzeugten Text ausgeben in den Ausgabestrom zu werfen, gibt sie einem Array zu speichern, das im zweiten Parameter der Funktion zurückgegeben wird:

En shell_exec() Funktion

Die meisten der Programme, die wir bisher durchgeführt haben, waren, mehr mehr oder weniger echte Programme1. Allerdings ist die Umgebung, in der Windows- und Unix-Benutzer arbeiten, ist in Wirklichkeit viel reichhaltiger als das. Windows-Benutzer haben die Möglichkeit, das Windows-Eingabeaufforderungsprogramm cmd.exe zu verwenden. Dieses Programm wird auch als Befehlsshell bezeichnet.

En passthru() Funktion

Eine faszinierende Funktion, die PHP ähnlich wie bisher gesehen haben, ist die PassThru-Funktion. Diese Funktion, wie auch die anderen, das Programm aus, das Sie ihr auftragen. Sie fährt dann jedoch fort mit sofort die Rohausgabe dieses Programms an den Ausgabestrom mit dem PHP gerade arbeitet (d.h. entweder HTTP in einem Webserver Szenario, oder die Shell in einer Kommandozeilenversion von PHP).

En proc_open() Funktion und popen() Funktion

proc_open() ist ähnlich wie popen(), bietet aber ein viel größeres Maß an Kontrolle über die Programmausführung. cmd ist der Befehl, der von der Shell ausgeführt werden soll. descriptorspec ist ein indiziertes Array, wobei der Schlüssel die Deskriptornummer darstellt und der Wert angibt, wie PHP diesen Deskriptor an den Kindprozess weitergibt. pipes wird auf ein indiziertes Array von Dateizeigern, die dem Ende von PHPs Pipes entspricht, die erzeugt werden. Der Rückgabewert ist eine Ressource, die den Prozess repräsentiert; Sie sollten ihn mit proc damit fertig sind.

22voto

Cody Caughlan Punkte 31774

Es kommt darauf an, wie Sie mit den Ausgaben umgehen wollen, die der Befehl zurückgibt, und ob Ihr PHP-Skript auf die Beendigung des aufgerufenen Programms warten soll oder nicht.

  • exec führt einen Befehl aus und übergibt die Ausgabe an den Aufrufer (oder gibt sie in einer optionalen Variablen zurück).

  • passthru ist ähnlich wie die exec() Funktion, da sie einen Befehl ausführt. Diese Funktion sollte verwendet werden anstelle von exec() o system() wenn die Ausgabe des Unix-Befehls binäre Daten sind, die direkt an den Browser zurückgegeben werden müssen.

  • system führt ein externes Programm aus und zeigt die Ausgabe an, allerdings nur die letzte Zeile.

Wenn Sie einen Befehl ausführen und alle Daten des Befehls direkt und ohne Beeinträchtigung zurückgeben möchten, verwenden Sie die passthru() Funktion.

10voto

Matt Punkte 2161

Wenn Sie Ihr PHP-Skript von der Kommandozeile aus ausführen, passthru() hat einen großen Vorteil. Damit können Sie Skripte/Programme ausführen wie vim , dialog , usw., wobei diese Programme die Kontrolle übernehmen und erst dann zu Ihrem Skript zurückkehren, wenn sie fertig sind.

Wenn Sie system() o exec() um diese Skripte/Programme auszuführen, wird es einfach nicht funktionieren.

Erwischt: Aus irgendeinem Grund können Sie nicht ausführen less con passthru() in PHP.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X