Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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