Página 1 de 1

PHP file_get_contents não acessa LAN

MensagemEnviado: 23 Dez 2020 09:42
por edsont
Estou com um problema no PHP. Eu consigo acessar site externo, mas não consigo acessar um servidor no ESP12.

Código: Selecionar todos
$status=file_get_contents('http://192.168.0.129/relay_toggle');


PHP Fatal error: Maximum execution time of 60 seconds exceeded in C:\\PortableApps\\usbwebserver_v8.6.2\\root\\status.php on line 7


Trocando o endereço por um endereço externo, como 'http://ipinfo.io/ip', acessa normal.

Acessando o ESP12 diretamente pelo browser também funciona sem problema.

No ESP12 está:
Código: Selecionar todos
  server.on("/relay_toggle",  HTTP_GET, [](AsyncWebServerRequest *request){
    String message="Relay state = ";
    relayState=!relayState;
    if (relayState) message+="ON\n";
    else message+="OFF\n";
    request->send(200, "text/plain", message);
    relayToggle=1;
    onRelay=millis();
  });


Alguém tem idéia de onde pode estar o problema?

Re: PHP file_get_contents não acessa LAN

MensagemEnviado: 23 Dez 2020 13:27
por tcpipchip
tenta fazer um ddns no teu esp32 e poe a referencia no PHP...(url)

Re: PHP file_get_contents não acessa LAN

MensagemEnviado: 23 Dez 2020 14:13
por edsont
tcpipchip escreveu:tenta fazer um ddns no teu esp32 e poe a referencia no PHP...(url)


Não funcionou. No browser sem o PHP funcionou.
E é um ESP12 (8266), mas dá na mesma.
Eu vou tentar usar html em vez de text/plain.

A idéia é evitar acesso externo direto ao ESP12, implementado alguma segurança no PHP.

Re: PHP file_get_contents não acessa LAN

MensagemEnviado: 23 Dez 2020 17:33
por edsont
Não funciona.

O ESP12 está comutando o relé e está respondendo ao GET do PHP mas o PHP fica travado na linha do file_get_contents até dar timeout.

A resposta do ESP12:
Código: Selecionar todos
HTTP/1.0 200 OK
Content-Length: 18
Content-Type: text/plain
Connection: close

Relay state = OFF

capturado com o SmartSniff

Alterei para HTTP/1.1 com as linhas abaixo mas continua sem funcionar.
Código: Selecionar todos
$context = stream_context_create(array('http'=>array('protocol_version'=>'1.1')));
$status=file_get_contents('http://192.168.0.129/relay_toggle',false, $context);

Re: PHP file_get_contents não acessa LAN

MensagemEnviado: 24 Dez 2020 17:27
por edsont
Parece que o PHP não reconhece o tamanho da mensagem, mantendo a conexão aberta até ocorrer o timeout.

Encontrei este relato:
https://bugs.php.net/bug.php?id=51330

Segundo o site para contornar o problema tem que ler apenas um byte, para obter o tamanho da mensagem no header e chamar novamente o file_get_contents, passando como parâmetro o tamanho total da mensagem.

Ainda estou procurando como extrair o content-length do header.

Re: PHP file_get_contents não acessa LAN

MensagemEnviado: 24 Dez 2020 17:43
por edsont
Encontrei script para resolver o problema.

https://stackoverflow.com/questions/109 ... gth-header

Código: Selecionar todos
$url = "http://some-adress/test.php";
$headers = get_headers($url, 1);
$content_length = $headers["Content-Length"];
$content = file_get_contents($url, NULL, NULL, NULL, $content_length);
echo $content;


O problema não ocorre com o webserver sincrono, somente no assíncrono (Arduino).