Прочитать входное значение из консоли / cli в момент вопроса

У меня проблема с чтением команд ввода из консольного приложения, созданного на php.

ПРОБЛЕМА

Если пользователь, использующий консоль по ошибке, нажимает два или более раз ENTER или несколько символов во время загрузки процесса, команда читается перед тем, как задать вопрос, а затем пропустить следующий.

Я пробовал эти методы для получения входного значения, но каждый раз нахожу одну и ту же проблему:

fgets(STDIN);
readline("Question: ");
stream_get_line(STDIN, 1024, "\n");

Пример кода:

<?php
for($i = 0; $i < 15; $i++){
    $read = readline("Question $i: "); // Look at the number
    echo "Your answer is: " . $read . PHP_EOL;
    sleep(2); // Now on execution try press ENTER one ore more times
}

ПОПЫТКИ

Я пробовал это, но этот метод не работает с буферами (я все равно пробовал точно):

$handle = fopen('php://stdin', 'r+');
ftruncate($handle, 0);
rewind($handle);
fclose($handle);
$read = readline("Question: ");

ВОПРОС

Как я могу читать и ждать ввода в момент отображения вопроса, отбрасывая предыдущий ввод?


person Marco Cesarato    schedule 05.03.2019    source источник


Ответы (1)


РЕШЕНИЕ

Я решил следующее:

<?php
for($i = 1; $i < 10; $i++){
    /* BEGIN: SOLUTION */
    // Read/Clean buffer until isn't empty
    while(stream_select($read = [STDIN], $write = [], $except = [], 0)){
      fgets(STDIN);
    }
    /* END: SOLUTION */
    $read = readline("Question $i: "); // Look at the number
    echo "Your answer is: " . $read . PHP_EOL;
    sleep(2); // Now on execution try press ENTER one ore more times
}
person Marco Cesarato    schedule 07.03.2019