PHP CLI: как прочитать один символ ввода из TTY (не дожидаясь нажатия клавиши ввода)?

Я хочу читать по одному символу из командной строки в PHP, однако кажется, что откуда-то есть какая-то буферизация ввода, предотвращающая это .

Рассмотрим этот код:

#!/usr/bin/php
<?php
echo "input# ";
while ($c = fread(STDIN, 1)) {
    echo "Read from STDIN: " . $c . "\ninput# ";
}
?>

Набрав "foo" в качестве ввода (и нажав Enter), я получаю следующий результат:

input# foo
Read from STDIN: f
input# Read from STDIN: o
input# Read from STDIN: o
input# Read from STDIN: 

input# 

Результат, который я ожидаю , будет:

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# 

(То есть символы читаются и обрабатываются по мере их ввода).

Однако в настоящее время каждый символ читается только после нажатия клавиши Enter. У меня есть подозрение, что TTY буферизует ввод.

В конечном итоге я хочу иметь возможность читать нажатия клавиш, такие как стрелка вверх, стрелка вниз и т. Д.

25
задан Benjamin 13 August 2018 в 15:40
поделиться