2010-05-28 9 views
16

Quiero escribir un script php que pueda usar desde la línea de comandos. Quiero que solicite entrada para algunos elementos y luego escuche algunos resultados. Quiero hacer esto en php, porque todas mis clases y bibliotecas están en php, y solo quiero hacer una simple interfaz de línea de comando para algunas cosas.¿cómo escribo una secuencia de comandos interactiva php script?

La sugerencia y aceptación de entradas de línea de comando repetidas es la parte que me está molestando. ¿Cómo hago esto?

Respuesta

12

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

necesita un archivo especial: php://stdin que representa la entrada estándar.

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 página I/O Streams del manual de PHP describe cómo se puede utilizar STDIN para leer una línea desde la línea de comandos:

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

El algoritmo es simple:

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

Es muy trivial para utilizar un Array() que se asigna a las órdenes de devolución de llamada funciones que los manipulan. El desafío completo es más o menos un ciclo while y dos llamadas a función, PHP también tiene un readline interface para aplicaciones de shell más avanzadas.

+0

La parte "leer una línea de comando de entrada" me dispara. ¿Cómo lo haces para sondear continuamente la entrada del usuario? – user151841

+0

Normalmente se hace algo así como while ($ line = readline ($ promptstring)); los detalles finos básicamente equivalen al tipo de verificación de errores que desea, y cómo el usuario pide salir. Eche un vistazo a las funciones fgets() y readline() en el manual. – TerryP

9

No estoy seguro de lo complejo que puede ser su entrada, pero readline es una excelente manera de manejar la situación para los programas interactivos de la CLI.

Obtienes las mismas comodidades de criatura que esperarías de tu caparazón, como el historial de comandos.

Su uso es tan simple como:

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

If available, lo que realmente hace que sea sencillo.

+0

La mejor manera de implementar una [CLI - Interfaz de línea de comandos] simple (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

Mis cinco centavos: Usando STDOUT y 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); 
Cuestiones relacionadas