it-swarm.com.de

PHP, übergeben Sie die Parameter von der Kommandozeile an a PHP Skript

Ich möchte Parameter von der Befehlszeilenschnittstelle PHP übergeben und dann die Werte mit dem Skript PHP einlesen.

<?php
  $name1 = $argv[1];    
  echo $name1;
?>

Ich übergebe die Variable von der CLI wie folgt:

C:\xampp\php\php.exe name.php Robby

Das obige funktioniert, ich bekomme Robby als Ausgabe. 

Aber ich möchte so etwas machen:

C:\xampp\php\php.exe name.php -inputFirstName="Robby"

Damit ist der Benutzer gut informiert, die richtigen Parameter an den richtigen Stellen einzugeben. Was ist der geeignete Weg, um diese Parameter zu analysieren?

23
125369

Wenn Sie ein PHP -Skript von der Befehlszeile aus aufrufen, können Sie mit $ argc herausfinden, wie viele Parameter übergeben werden, und mit $ argv auf diese zugreifen. Zum Beispiel das folgende Skript ausführen:

<?php
    var_dump($argc); //number of arguments passed 
    var_dump($argv); //the arguments passed
?>

So was:-

php script.php arg1 arg2 arg3

Gibt die folgende Ausgabe aus

int(4)
array(4) {
  [0]=>
  string(21) "d:\Scripts\script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}

Siehe $ argv und $ argc für weitere Details.

Um zu tun, was Sie wollen, lassen Sie uns sagen

php script.php arg1=4

Sie müssten das Argument auf das Gleichheitszeichen auflösen: -

list($key, $val) = explode('=', $argv[1]);
var_dump(array($key=>$val));

Auf diese Weise können Sie das Gleichheitszeichen vor das Gleichheitszeichen stellen, ohne es zu parsen. Überprüfen Sie einfach, ob die Schlüsselpaare => richtig sind. Dies ist jedoch alles ein bisschen Verschwendung, weisen Sie den Benutzer nur in der richtigen Reihenfolge an, um die Argumente zu übergeben.

34
vascowhite

Die Antwort ist zwar korrekt und Sie können das Parsen von Hand durchführen, jedoch bietet PHP auch die Funktion getopt(), die hier tatsächlich nützlich sein könnte. 

Es gibt auch objektorientierte Alternativen (in PHP geschrieben, in einer Reihe von Bibliotheken verfügbar), die sich als das erweisen könnten, was Sie brauchen. Wenn Sie nach "php getopt" googeln, erhalten Sie hilfreiche Ergebnisse. 

13
Konrad Neuwirth

Ich verwende diese ziemlich prägnante Methode:

if($argc>1)
  parse_str(implode('&',array_slice($argv, 1)), $_GET);

Welches würde einen Anruf behandeln, wie:

php script.php item1=4 item2=300

Durch das Senden in $ _GET erledigen Sie automatisch den Web- oder CLI-Zugriff.

Für Kommentare führt dies Folgendes aus:

  • Wenn die Anzahl der Argumente größer als eins ist (der erste Eintrag ist der Name des Skripts), wird der Vorgang fortgesetzt
  • Holen Sie sich das Argument-Array mit Ausnahme des ersten Elements
  • Verwandeln Sie es in ein Standard-Abfragezeichenfolgenformat mit Et-Zeichen
  • verwenden Sie parse_str, um das Array $ _GET zu extrahieren
12
NickM

Die getopt()-Funktion ist wahrscheinlich die richtigste Antwort auf die Frage. Zumal es mit PHP 5.3 plattformunabhängig wurde. 5.3. Im speziellen Fall dieser Frage und beim Parsen mehrerer Parameter besteht eine Möglichkeit, diese Funktion zu nutzen:

$defaultValues = array("inputFirstName" => "");
$givenArguments = getopt("", array("inputFirstName:"));
$options = array_merge($defaultValues, $givenArguments);
$inputFirstName = $options['inputFirstName'];

Der Aufruf, $ inputFirstName mit dem Wert "Robby" zu setzen, lautet:

> php script.php --inputFirstName="Robby"

Erklärung

Standardwerte für alle erwarteten Parameter werden im $defaultValues-Array festgelegt. Eingaben, die über Befehlszeilenargumente gesendet werden, werden von der getopt-Funktion von PHP gesammelt und vom $givenArguments gespeichert. Beachten Sie, dass der Doppelpunkt (:) am Ende der "inputFirstName:"-Zeichenfolge darauf hinweist, dass dies ein erforderliches Argument ist. Ohne Doppelpunkt würde hier nur das Vorhandensein des Arguments erkannt werden, nicht der tatsächliche Wert ( weitere Informationen im Handbuch PHP ). Das Zusammenführen dieser beiden Arrays in der dritten Zeile führt dazu, dass das Array mit allen erwarteten Parametern entweder mit Standardwerten oder Argumenten, die von der Befehlszeile/vom Terminal bereitgestellt werden, festgelegt wird, sofern sie verfügbar sind.

1
bnp887

Wenn Sie nichts dagegen haben, eine Bibliothek zu verwenden, empfehle ich Ihnen, The Console Component von Symfony zu lesen.

Es kann zum Erstellen von Befehlszeilenanwendungen verwendet werden und unterstützt die Verwendung von Arguments & Options .

Die Dokumentationsseite enthält einige hervorragende Beispiele, um den Einstieg zu erleichtern.

Natürlich verwendet es unter der Haube die gleichen Techniken, die Vascowhite erklärt.

0
Gijs de Jong