PHP CLI: Wie liest man ein einzelnes Zeichen der Eingabe vom TTY (ohne auf die Enter-Taste zu warten)?
Möchte ich Lesen, ein einzelnes Zeichen, at-a-time " von der Befehlszeile aus in PHP, aber es scheint, als gäbe es irgendeine Art von input Pufferung von irgendwo, dies zu verhindern.
Betrachten Sie diesen code:
#!/usr/bin/php
<?php
echo "input# ";
while ($c = fread(STDIN, 1)) {
echo "Read from STDIN: " . $c . "\ninput# ";
}
?>
Suchbegriff "foo" als input (und die EINGABETASTE drücken), wird der Ausgang bin ich immer:
input# foo
Read from STDIN: f
input# Read from STDIN: o
input# Read from STDIN: o
input# Read from STDIN:
input#
Den Ausgang bin ich erwartet ist:
input# f
input# Read from STDIN: f
input# o
input# Read from STDIN: o
input# o
input# Read from STDIN: o
input#
input# Read from STDIN:
input#
(Das heißt, mit Zeichen, die gelesen und verarbeitet werden, wie Sie eingegeben werden).
Derzeit allerdings, jedes Zeichen wird nur gelesen, nachdem die EINGABETASTE gedrückt wird. Ich habe den Verdacht das TTY ist die Pufferung der Eingabe.
Letztlich will ich Lesen zu können, drücken von Tasten wie OBEN, UNTEN, etc.
Vielen Dank im Voraus!
InformationsquelleAutor der Frage dansimau | 2010-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung für mich war, war die
-icanon
- Modus der TTY (mitstty
). ZB.:So, das der code, der jetzt funktioniert ist:
Ausgabe:
Requisiten, um die Antwort, die hier gegeben werden:
Gibt es eine Möglichkeit, warten und bekommen einen Tastendruck von einem (remote -) terminal session?
Weitere Informationen finden Sie unter:
http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html#AEN92
Vergessen Sie nicht wiederherstellen Sie die TTY-wenn Sie fertig sind mit es...
Wiederherstellung der tty-Konfiguration
Zurücksetzen der terminal zurück zu dem Weg war es getan werden kann, indem die tty-Zustand, bevor Sie änderungen daran vornehmen. Sie können dann die Wiederherstellung bis zu diesem Zustand, wenn Sie fertig sind.
Beispiel:
Dies ist der einzige Weg zur Erhaltung der tty und setzen Sie es zurück, wie der Benutzer die hatte es, bevor Sie begann.
Beachten Sie, dass wenn Sie nicht besorgt über die Erhaltung der original-Zustand, können Sie es zurücksetzen zurück zu einer Standard - "sane" - Konfiguration, indem Sie einfach tun:
InformationsquelleAutor der Antwort dansimau
Hier ist ein Weg, der funktioniert für mich mit der readline-und stream-Funktionen, ohne mess mit tty-Zeug.
Getestet mit PHP 5.5.8 auf OSX.
InformationsquelleAutor der Antwort seb
Die untenstehende Funktion ist eine vereinfachte version von @seb die Antwort, die verwendet werden können erfassen ein einzelnes Zeichen. Es erfordert nicht
stream_select
und verwendetreadline_callback_handler_install
's inhärenten blockieren, anstatt eine while-Schleife. Es beseitigt auch die handler um eine weitere Eingabe als normal (z.B. readline).InformationsquelleAutor der Antwort Synexis
InformationsquelleAutor der Antwort joeldg