2010-05-28 19 views
16

Ich möchte ein PHP-Skript schreiben, das ich über die Befehlszeile verwenden kann. Ich möchte, dass es Eingaben für einige wenige Elemente anfordert und akzeptiert und dann einige Ergebnisse ausspuckt. Ich möchte dies in PHP tun, weil alle meine Klassen und Bibliotheken in PHP sind, und ich möchte nur eine einfache Befehlszeilenschnittstelle zu einigen Dingen machen.Wie schreibe ich ein interaktives Kommandozeilen-PHP-Skript?

Das Auffordern und Akzeptieren wiederholter Befehlszeileneingaben ist der Teil, der mich stolpert. Wie mache ich das?

Antwort

12

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

Sie benötigen eine spezielle Datei: php://stdin steht für die Standardeingabe.

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

Die I/O Streams Seite aus dem PHP-Handbuch beschreibt, wie Sie STDIN können Sie eine Linie von der Kommandozeile lesen:

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

Der Algorithmus ist einfach:

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

Es ist sehr trivial ist ein Array() zu verwenden, die Befehle abbildet Funktionen Rückruf, die sie handhaben. Die gesamte Herausforderung ist in etwa eine while-Schleife, und zwei Funktionsaufrufe, PHP hat auch eine readline interface für erweiterte Shell-Anwendungen.

+0

Der Teil "Eingabezeile lesen" löst mich aus. Wie bekommen Sie es, um die Benutzereingaben kontinuierlich abzufragen? – user151841

+0

Normalerweise wird etwas wie while ($ line = readline ($ promptstring)); Die feinen Details sind im Grunde genommen die Art der Fehlerprüfung, die Sie wünschen, und wie der Benutzer das Beenden fordert. Sehen Sie sich die Funktionen fgets() und readline() im Handbuch an. – TerryP

9

Ich bin nicht sicher, wie komplex Ihre Eingabe sein könnte, aber readline ist eine hervorragende Möglichkeit für interaktive CLI-Programme zu handhaben.

Sie erhalten den gleichen Komfort, den Sie von Ihrer Shell erwarten würden, wie zum Beispiel die Befehlsgeschichte.

es ist so einfach wie:

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

If available, es wirklich einfach macht.

+0

Die beste Methode zur Implementierung einer einfachen [CLI - Befehlszeilenschnittstelle] (https://en.wikipedia.org/wiki/Command-line_interface)! –

1

Ganz einfach:

#!/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

Meine fünf Cent: STDOUT Verwendung und 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); 
Verwandte Themen