Проблема с чтением STDIN из консольной команды в Laravel 5.8 под Windows

Что-то очень странное происходит со стандартным потоком при попытке прочитать его из консольной команды в проекте на Laravel. Если запустить команду, например, php artisan test-command < file.txt с кодом типа:

    public function handle()
    {
        while (($s = fgets(STDIN)) !== false) {
            var_dump($s);
        }
    }

или

    public function handle()
    {
        var_dump(file_get_contents('php://stdin'));
    }

то скрипт не выводит ничего. Скрипт ведёт себя так, как будто в него передали пустой файл. При этом в самом начале feof(STDIN) возвращает false. Но первое же чтение через fgets(STDIN) возвращает false. И уже после этого feof(STDIN) возвращает true.

Этот же код, размещённый не в команде Laravel, а в голом PHP-скрипте, естественно работает как надо без каких-либо сюрпризов.

Если запустить скрипт без передачи в него файла (php artisan test-command), то скрипт будет читать ввод с клавиатуры и тут всё хорошо. Скрипт будет получать ввод вплоть до строки Ctrl+Z и Enter. То есть проблема проявляется только при передаче потока из файла или другой программы (cat file.txt | php artisan test-command имеет тот же результат).

Проявляется данная проблема под Windows (в моём случае 10). Под Linux проблема не замечена. Версия Laravel 5.8.38 Хочется понять откуда растут ноги у этой проблемы. Кто-нибудь с таким сталкивался?


Ответы (0 шт):