Проблема с чтением 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 Хочется понять откуда растут ноги у этой проблемы. Кто-нибудь с таким сталкивался?