web-dev-qa-db-fra.com

PHP, passe les paramètres de la ligne de commande à un PHP scénario

Je souhaite transmettre les paramètres de l'interface de ligne de commande PHP, puis lire les valeurs à l'aide du script PHP, à peu près comme ceci:

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

Je passe la variable de CLI comme ceci:

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

Ce qui précède fonctionne, je reçois Robby en sortie. 

Mais je veux faire quelque chose comme ça:

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

De sorte que l'utilisateur soit bien informé pour entrer les bons paramètres aux bons endroits. Quelle est la manière appropriée d'analyser ces paramètres?

23
125369

Lorsque vous appelez un script PHP à partir de 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 ça:-

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 tu veux, disons

php script.php arg1=4

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

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

De cette façon, vous pouvez avoir ce que vous voulez devant le signe égal sans avoir à l'analyser. Il suffit de vérifier que les paires clé => valeur sont correctes. Cependant, c'est un peu un gaspillage, il suffit d'indiquer à l'utilisateur l'ordre correct de passer les arguments.

34
vascowhite

Bien que la réponse soit correcte et que vous puissiez effectuer l'analyse syntaxique à la main, PHP propose également la fonction getopt() qui pourrait s'avérer utile ici. 

Il existe également 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 pour "php getopt" donnera des résultats utiles. 

13
Konrad Neuwirth

J'utilise cette méthode assez concise:

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 gérez automatiquement les accès Web ou CLI.

Pour commentaire, procédez comme suit:

  • Si le nombre d'arguments est supérieur à un (le premier élément étant le nom du script), continuez
  • Prenez le tableau d'arguments en excluant le premier élément
  • Transformez-le en un format de chaîne de requête standard avec des esperluettes
  • utilisez parse_str pour extraire le tableau $ _GET
12
NickM

La fonction getopt() est probablement la réponse la plus correcte dans le cas de la question. Surtout depuis qu'il a été rendu plate-forme indépendante avec PHP 5.3. Dans le cas particulier de cette question et de l'analyse de plusieurs paramètres, l'une des manières de tirer parti de cette fonction serait la suivante:

$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

Les valeurs par défaut pour tous les paramètres attendus sont définies dans le tableau $defaultValues. Les entrées envoyées via des arguments en ligne de commande sont collectées par la fonction getopt de PHP et stockées par le $givenArguments. Notez que les deux points (:) à la fin de la chaîne "inputFirstName:" indiquent qu'il s'agit d'un argument requis. Sans les deux points 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 paramètres attendus définis avec des valeurs par défaut ou des arguments fournis par la ligne de commande/le terminal, s'ils sont disponibles.

1
bnp887

Si cela ne vous dérange pas d'utiliser une bibliothèque, je vous suggère de regarder Le composant console de Symfony .

Il peut être utilisé pour créer des applications en ligne de commande et prend en charge l'utilisation de Arguments & 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
Gijs de Jong