2010-05-28 6 views
16

Je veux écrire un script PHP que je peux utiliser depuis la ligne de commande. Je veux qu'il invite et accepte l'entrée pour quelques articles, et crache alors quelques résultats. Je veux le faire en PHP, parce que toutes mes classes et bibliothèques sont en php, et je veux juste faire une interface de ligne de commande simple à quelques choses.Comment écrire un script php interactif en ligne de commande?

L'invite et l'acceptation des entrées de ligne de commande répétées est la partie qui me fait trébucher. Comment puis-je faire cela?

Répondre

12

De PHP: Read from Keyboard – Get User Input from Keyboard Console by Typing:

Vous avez besoin d'un fichier spécial: php://stdin qui représente l'entrée standard.

print "Type your message. Type '.' on a line by itself when you're done.\n"; 

$fp = fopen('php://stdin', 'r'); 
$last_line = false; 
$message = ''; 
while (!$last_line) { 
    $next_line = fgets($fp, 1024); // read the special file to get the user input from keyboard 
    if (".\n" == $next_line) { 
     $last_line = true; 
    } else { 
     $message .= $next_line; 
    } 
} 
17

La page I/O Streams du manuel PHP décrit comment vous pouvez utiliser STDIN pour lire une ligne de la ligne de commande:

<?php 
$line = trim(fgets(STDIN)); // reads one line from STDIN 
fscanf(STDIN, "%d\n", $number); // reads number from STDIN 
?> 
1

L'algorithme est simple:

until done: 
    display prompt 
    line := read a command line of input 
    handle line 

Il est très trivial d'utiliser un tableau() qui mappe les commandes de rappel automatique des fonctions qui les manipulent. Le défi entier est à peu près une boucle while, et deux appels de fonction, PHP a également un readline interface pour les applications shell plus avancées.

+0

La partie "lire une ligne de commande d'entrée" me fait trébucher. Comment obtenez-vous pour interroger continuellement l'entrée de l'utilisateur? – user151841

+0

Normalement, il est fait quelque chose comme while ($ line = readline ($ promptstring)); les détails fins correspondent essentiellement au type de vérification d'erreur que vous voulez, et à la manière dont l'utilisateur demande à quitter. Jetez un oeil aux fonctions fgets() et readline() dans le manuel. – TerryP

9

Je ne sais pas comment votre entrée complexe peut-être, mais readline est une excellente façon de le gérer pour les programmes CLI interactifs.

Vous obtenez les mêmes conforts de créatures que vous attendez de votre shell, tels que l'historique des commandes.

Son utilisation est aussi simple que:

$command = readline("Enter Command: "); 
/* Then add the input to the command history */ 
readline_add_history($command); 

If available, il fait vraiment simple.

+0

Meilleure façon d'implémenter un simple [CLI - Interface de ligne de commande] (https://en.wikipedia.org/wiki/Command-line_interface)! –

1

simple:

#!/usr/bin/php 
<?php 
define('CONFIRMED_NO', 1); 

while (1) { 
    fputs(STDOUT, "\n"."***WARNING***: This action causes permanent data deletion.\nAre you sure you're not going to wine about it later? [y,n]: "); 

    $response = strtolower(trim(fgets(STDIN))); 
    if($response == 'y') { 
     break; 
    } elseif($response == 'n') { 
     echo "\n",'So I guess you changed your mind eh?', "\n"; 
     exit (CONFIRMED_NO); 
    } else { 
     echo "\n", "Dude, that's not an option you idiot. Let's try this again.", "\n"; 
     continue; 
    } 
} 

echo "\n","You're very brave. Let's continue with what we wanted to do.", "\n\n"; 
1

Mes cinq cents: En utilisant STDOUT et STDIN:

fwrite(STDOUT, "Please enter your Message (enter 'quit' to leave):\n"); 

do{ 
    do{ 
     $message = trim(fgets(STDIN)); 
    } while($message == ''); 

    if(strcasecmp($message, 'quit') != 0){ 
     fwrite(STDOUT, "Your message: ".$message."\n"); 
    } 

}while(strcasecmp($message,'quit') != 0); 
// Exit correctly 
exit(0); 
Questions connexes