13
respostas

Não consigo executar o exemplo da aula: Streams ReactPHP - Lendo arquivos

Olá, Estou tentado executar o exemplo da aula, porém ocorre o seguinte erro:

Unable to set stream resource to non-blocking mode Linha : 56

#0 P:\xampp\htdocs\Alura\PHP\PHP Reativo - Programação Assincrona em tempo real\react-io-nb.php(12): React\Stream\ReadableResourceStream->__construct(Resource id #30, Object(React\EventLoop\StreamSelectLoop))

#1 {main}

Código:

    require 'vendor/autoload.php';

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

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

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

    $loop->run();
13 respostas

Francisco, honestamente nnca tive esse erro. O arquivo em questão existe? Você consegue ler dele com fwrite (de forma bloqueante, tradicional)? Se sim, qual sua versão do PHP e sistema operacional?

Os arquivos existem, foram utilizados na aula anterior. Segue um print da aula anterior:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Aqui a versão do php:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Informações do sistema operacional:

Windows 10 Home Single Language (Comprei um lenovo s145 e veio com este SO).

Execução do exemplo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Francisco, eu tentaria 2 coisas (honestamente é no chute porque não sei o que pode estar causando o problema):

  1. Passar o caminho completo do arquivo
  2. Atualizar a versão do PHP para a 8.

Vi em algumas pesquisas um bug específico do PHP no Windows (mas parece ter sido corrigido). Se com as 2 sugestões isso não funcionar, a gente pode tentar rodar o código num container do Docker?

Vinicius, Fiz os dois procedimentos, porém, não funcionou. Acho que pode ser algo com a versão do SO.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Não tenho conhecimento de docker, é um dos cursos que preciso fazer.. rs.. Eu não olhei o restante do conteúdo do curso, se o restante do curso não utilizar este exemplo, posso tentar avançar no conteúdo.

Francisco, acabei de ver que você está usando xampp, né!? Consegue testar a instalação do PHP sem ser usando XAMPP?

Se continuar não funcionando e você conseguir ao menos instalar o Docker, tenta rodar através desse comando:

docker run --rm -itv P:\caminho\do\projeto:/app -w /app php:latest php react-io-nb.php

Outra recomendação é evitar caminhos com espaços nos nomes. Windows costuma dar bastante problema com isso.

Vinicius, não tem jeito, é a máquina.. A instalação do docker deu pau também.. hahahah

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Vou instalar uma versão PRO do windows.

Eita... Windows é punk. rsrsrs

Pesquisando aqui, o único caso onde esse erro acontece (em todos os links que achei) é quando tenta definir como não bloqueante o STDIN ou STDOUT no Windows. Pra arquivos não era pra isso acontecer. Eu não tenho acesso a nenhum Windows por aqui, mas será que você consegue debugar essa execução pra ver se consegue alguma informação a mais?

Francisco, você tem alguma atualização sobre o caso?

Abri essa issue no GitHub do projeto para ver se eles conseguem nos ajudar:

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

@Vinicius Dias, na época que fiz esse curso eu só estava com Windows na máquina e se lembro bem tive que instalar o WSL e nele eu instalei o PHP também. Eu escrevia todo código no Windows e quando precisava executar eu ia para o Linux (porque era apenas linha de comando).

Eles tinham algum problema com a API para o Windows e até o ano passado (quando realizei o curso) não tinham resolvido essa questão e me deu a entender que iam demorar bastante.

Pois é... Abri essa issue no GitHub do pacote de streams do ReactPHP e vou acompanhar lá. Tomara que respondam.

Além do Docker pode ir indicando a instalação do WSL como alternativa, comigo funcionou direito e realizei o curso. O problema é que nem todo mundo tem o traquejo, porque após a instalação ainda é preciso configurar o ambiente, navegar entre as pastas, etc...

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. =/