PHP, passer des paramètres de la ligne de commande à un script PHP

je veux passer les paramètres de L'Interface de ligne de commande PHP, puis les lire dans les valeurs en utilisant le script PHP, quelque chose comme ceci:

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

je passe la variable à partir de la CLI, comme ceci:

C:xamppphpphp.exe name.php Robby

Les travaux ci-dessus, j'obtiens Robby comme la sortie.

Mais je veux faire quelque chose comme ceci:

C:xamppphpphp.exe name.php -inputFirstName="Robby"

de Sorte que l'utilisateur est bien informé pour entrer les paramètres appropriés dans les bons endroits. Quelle est la meilleure façon de les analyser? les paramètres?

21
demandé sur Eric Leschinski 2012-06-15 14:20:41

6 réponses

lorsque vous appelez un script PHP depuis la ligne de commande, vous pouvez utiliser $argc pour savoir combien de paramètres sont passés et $argv pour y accéder. Par exemple en exécutant le script suivant:

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

Comme ceci:-

php script.php arg1 arg2 arg3

donnera la sortie suivante

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

Voir $ argv et $argc pour plus de détails.

Pour faire ce que vous voulez, disons

php script.php arg1=4

vous auriez besoin d'exploser le l'argument sur le signe égal:-

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

de cette façon, vous pouvez avoir tout ce que vous voulez devant le signe égal sans avoir à l'analyser, vérifiez simplement que les paires de valeurs key=>sont correctes. Cependant, c'est un peu du gaspillage, simplement demander à l'utilisateur sur le bon de commande pour passer les arguments.

30
répondu vascowhite 2014-08-09 23:02:41

alors que la réponse est correcte et que vous pouvez faire l'analyse à la main, PHP offre aussi le getopt() fonction qui pourrait réellement utile ici.

Il y a aussi des alternatives orientées objet (écrites en PHP, disponibles dans un certain nombre de bibliothèques) qui pourraient s'avérer être ce dont vous avez besoin. Googler "php getopt" donnera des résultats utiles.

12
répondu Konrad Neuwirth 2012-06-15 12:19:41

j'utilise assez concis méthode:

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

qui traiterait un appel tel que:

php script.php item1=4 item2=300

en l'envoyant dans $_GET vous manipulez automatiquement l'accès web ou CLI.

Pour les commentaires, c'est faire le suivant:

  • Si le nombre d'arguments est supérieur à un (en tant que premier élément est le nom du script) l'procédez
  • Saisir le tableau d'arguments à l'exclusion premier élément
  • en faire une norme format de chaîne de requête avec des esperluettes
  • utilisez parse_str pour extraire vers le tableau $_GET
11
répondu NickM 2013-07-06 15:19:44

getopt() la fonction est probablement la réponse la plus correcte dans le cas de la question. D'autant plus qu'il a été rendu plate-forme indépendante avec PHP 5.3. Dans le cas particulier de cette question et l'analyse de plusieurs paramètres, une façon de tirer parti de cette fonction serait comme suit:

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

l'appel à définir $inputFirstName avec la valeur "Robby" serait:

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

Explication

valeurs par Défaut pour tous les paramètres attendus sont définies dans le $defaultValues array. Les entrées envoyées via les arguments en ligne de commande sont collectées par getopt et stocké par la fonction $givenArguments. Notez que le côlon (:) à la fin du "inputFirstName:" string indique qu'il s'agit d'un argument requis. Sans un colon ici, seule la présence de l'argument serait détectée, pas la valeur réelle (plus d'informations dans le manuel PHP). La fusion de ces deux tableaux sur la troisième ligne donne un tableau avec tous les résultats attendus les paramètres étant définis avec des valeurs par défaut ou des arguments fournis depuis la ligne de commande/le terminal s'ils sont disponibles.

1
répondu wclear 2018-06-19 09:12:12

Si vous n'avez pas l'esprit à l'aide d'une bibliothèque, je vous suggère de prendre un coup d'oeil à Le Composant de la Console par Symfony.

il peut être utilisé pour créer des applications en ligne de commande et supporte l'utilisation de Les Arguments Et Options.

la page de documentation contient quelques excellents exemples pour vous aider à démarrer.

bien sûr sous le capot il utilise les mêmes techniques que celles expliquées par vascowhite.

0
répondu Gijs de Jong 2018-06-19 09:22:37

Vous pouvez analyser les entrées de l'utilisateur sur votre programme à la recherche de chaînes spécifiques telles que -inputFirstName="x" (en utilisant des expressions régulières, par exemple) et ensuite définir la bonne variable à X.

-1
répondu Álvaro 2012-06-15 10:26:45