4
respostas

PHP Fatal error: Uncaught RuntimeException: Unable to set stream resource to non-blocking mode

Erro aun tentar executar o php abaixo:

<?php

use React\EventLoop\Factory;
use React\Stream\ReadableResourceStream;

require_once 'vendor/autoload.php';

$loop = Factory::create();

$stream = new ReadableResourceStream(fopen('arquivo.txt', 'r'), $loop);

$stream->on('data', function (string $data) {
    echo $data;
});

$loop->run();

Erro:

PS D:\DEV\alura\php_reativo\1960-php-reativo-projeto-inicial> php react-io-nb.php
PHP Fatal error:  Uncaught RuntimeException: Unable to set stream resource to non-blocking mode in D:\DEV\alura\php_reativo\1960-php-reativo-projeto-inicial\vendor\react\stream\src\ReadableResourceStream.php:58
Stack trace:
#0 D:\DEV\alura\php_reativo\1960-php-reativo-projeto-inicial\react-io-nb.php(10): React\Stream\ReadableResourceStream->__construct(Resource id #29, Object(React\EventLoop\StreamSelectLoop))
#1 {main}
  thrown in D:\DEV\alura\php_reativo\1960-php-reativo-projeto-inicial\vendor\react\stream\src\ReadableResourceStream.php on line 58

Fatal error: Uncaught RuntimeException: Unable to set stream resource to non-blocking mode in D:\DEV\alura\php_reativo\1960-php-reativo-projeto-inicial\vendor\react\stream\src\ReadableResourceStream.php:58
Stack trace:
#0 D:\DEV\alura\php_reativo\1960-php-reativo-projeto-inicial\react-io-nb.php(10): React\Stream\ReadableResourceStream->__construct(Resource id #29, Object(React\EventLoop\StreamSelectLoop))
#1 {main}
  thrown in D:\DEV\alura\php_reativo\1960-php-reativo-projeto-inicial\vendor\react\stream\src\ReadableResourceStream.php on line 58

Vi que temos 2 posts relatando o mesmo problema o mais recente aponta para o mais antigo, onde segui as sugestões mas não resolveu o problema. Não sei se os colegas conseguiram resolver no ambiente em que estavam ou tiveram que partir para outro ambiente de desenvolvimento para conseguir dar andamento.

Conforme sugestão no questionamento mais antigo incluí o caminho completo do arquivo:

<?php

use React\EventLoop\Factory;
use React\Stream\ReadableResourceStream;

require_once 'vendor/autoload.php';

$loop = Factory::create();

$stream = new ReadableResourceStream(fopen(__DIR__ . '\arquivo.txt', 'r'), $loop);

$stream->on('data', function (string $data) {
    echo $data;
});

$loop->run();

Mas obtive o mesmo erro. A outra sugestão era de atualizar o PHP para a versão 8, mas estou com a versão 8.0.9:

PS D:\DEV\alura\php_reativo\1960-php-reativo-projeto-inicial> php -v  
PHP 8.0.9 (cli) (built: Jul 29 2021 14:12:19) ( ZTS Visual C++ 2019 x64 )
Copyright (c) The PHP Group
Zend Engine v4.0.9, Copyright (c) Zend Technologies

Estou num Windows 10 Pro, utilizando o Visual Studio Code, o caminho até o arquivo não tem caracteres especiais, e o script da aula anterior, funcionou normalmente, abrindo e lendo o mesmo arquivo em questão.

Acredito que também vou ter que partir para outro ambiente de desenvolvimento mas é intrigante ter funcionado no script anterior, sem o React e com ele dar este problema.

Obs.: segui a aula apenas com o servidor http e o socket, estes sem problema.

4 respostas

Vianei, eu recebi outra dúvida parecida e aparentemente é um problema com o Windows. Abri essa issue no GitHub do projeto para ver se eles conseguem reproduzir e solucionar:

https://github.com/reactphp/stream/issues/167

Bom dia Vinicius, blz!! Obrigado!! Acho q mantenho o tópico aqui aberto até termos novidades pra auxiliar futuros alunos, ok?

O meu objetivo com este curso era mesmo a troca de dados por socket, e o curso meu ajudou muito com isso!! Parabéns pela didática! Ainda faltam alguns detalhes na minha implementação mas acredito que agora consigo resolver.

Obrigado!

Acho q mantenho o tópico aqui aberto até termos novidades pra auxiliar futuros alunos, ok?

Sim sim. Até a gente achar uma solução, mantém aberto sim.

e o curso meu ajudou muito com isso

Ah, fico feliz demais em saber que mesmo com esse probleminha, no final deu tudo certo! :-D

Obrigado por esse retorno.

Peço desculpas por não ter notado antes, mas acabei de ver na documentação do PHP a seguinte nota:

On Windows, this has no affect on local files. Non-blocking IO for local files is not supported on Windows.

Ou seja, isso realmente não funciona no Windows. =/