skcratch Posted October 19, 2009 at 04:35 PM Report Share #292358 Posted October 19, 2009 at 04:35 PM Viva! Estou a utilizar a seguinte função para enviar um HTTP POST de um cliente para um servidor: public function sendRequest($xmlRequest) { // open a connection through a socket to IPTVServer $fp = fsockopen($this->serverAddress, $this->serverIpPort); if ($fp != null) { // set the HTTP POST headers fputs($fp, "POST / HTTP/1.1\r\n"); fputs($fp, "Host: $this->serverAddress\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: " . strlen($xmlRequest) . "\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $xmlRequest); $result = ''; while(!feof($fp)) { // receive the results of the request $result .= fgets($fp); } // close the socket connection: fclose($fp); // split the result header from the content $result = explode("\r\n\r\n", $result, 2); $header = isset($result[0]) ? $result[0] : ''; $content = isset($result[1]) ? $result[1] : ''; // remove iptvxml= from the response $response = str_replace("iptvxml=", "", $content); // return the xml string with the IPTVServer response return $response; } } Durante muito tempo, este método funcionou na perfeição mas agora está com alguns problemas. A ligação entre o cliente e o servidor é estabelecida com sucesso através do socket mas quando tento obter a resposta, a execução fica pendurada no ciclo while. Já defini vários tamanhos como segundo argumento da função fgets mas o problema continua. Será que alguém pode dar uma ajuda? Cumps! 😁 Link to comment Share on other sites More sharing options...
skcratch Posted October 19, 2009 at 05:13 PM Author Report Share #292365 Posted October 19, 2009 at 05:13 PM Viva! Por favor, algum moderador que mova este tópico para a secção de "Dúvidas e Ajudas". Cumps! 😁 Link to comment Share on other sites More sharing options...
jreis Posted October 19, 2009 at 08:24 PM Report Share #292417 Posted October 19, 2009 at 08:24 PM Aparentemente está tudo bem. Verifica se foram feitos updates do sistem ás máquinas (tanto servidor como cliente), poderá ser a causa. Ou outra configuração que foi alterada? Se o código funcionava antes e agora já não funciona, e se este não foi alterado... ...podemos concluir que foi outro factor que mudou? Outra coisa, um aviso presente no manual do PHP (que poderá aplicar-se ao teu caso), aqui fala em fopen() mas suponho que seja similar com fsockopen(): If the passed file pointer is not valid you may get an infinite loop, because feof() fails to return TRUE. Example #1 feof() example with an invalid file pointer <?php // if file can not be read or doesn't exist fopen function returns FALSE $file = @fopen("no_such_file", "r"); // FALSE from fopen will issue warning and result in infinite loop here while (!feof($file)) { } fclose($file); ?> "Pensa positivo: tudo pode piorar" Link to comment Share on other sites More sharing options...
skcratch Posted October 19, 2009 at 08:45 PM Author Report Share #292421 Posted October 19, 2009 at 08:45 PM Viva! Eu faço o teste que mencionas-te: caso não se consiga estabelecer a ligação através do socket, este devolve null e não executa o código seguinte. Grato pela ajuda, Cumps! 😁 Link to comment Share on other sites More sharing options...
elcsat Posted October 19, 2009 at 11:23 PM Report Share #292454 Posted October 19, 2009 at 11:23 PM se nao for indiscriçao tas aplicar isso a quer...para quer Link to comment Share on other sites More sharing options...
jreis Posted October 20, 2009 at 09:01 AM Report Share #292470 Posted October 20, 2009 at 09:01 AM (...)Eu faço o teste que mencionas-te: caso não se consiga estabelecer a ligação através do socket, este devolve null e não executa o código seguinte.(...) Bem visto, tenho de ler melhor as coisas..! "Pensa positivo: tudo pode piorar" Link to comment Share on other sites More sharing options...
skcratch Posted October 20, 2009 at 09:50 AM Author Report Share #292479 Posted October 20, 2009 at 09:50 AM Viva! O problema que referi anteriormente, pode estar de alguma forma relacionado com o tamanho do corpo do pedido que é efectuado? Grato desde já pela ajuda, Cumps! 😁 Link to comment Share on other sites More sharing options...
jreis Posted October 20, 2009 at 10:08 AM Report Share #292482 Posted October 20, 2009 at 10:08 AM O protocolo HTTP em si não define limites máximos para o tamanho do pedido, mas o webserver pode definir tais limites. Não será má ideia verificar isso. Se estiveres a enviar os dados para um script PHP, verifica no php.ini do servidor o suspeito do costume: post_max_size, por defeito 8MB. Se não estou em erro o Apache por defeito não tem qualquer limite definido. Outros webserver/linguagens, só vendo. De qualquer forma, o server não te devolve nenhum código de erro, nada de nada? "Pensa positivo: tudo pode piorar" Link to comment Share on other sites More sharing options...
skcratch Posted October 20, 2009 at 10:50 AM Author Report Share #292498 Posted October 20, 2009 at 10:50 AM Viva! Neste momento estou a utilizar o Wamp 2.0 como ambiente de desenvolvimento. No logger do PHP não é escrita qualquer mensagem de erro, apenas fico "pendurado" quando tento executar um pedido. De notar, que para outros pedidos idênticos (envio de um PHP POST através de um socket sendo a mensagem uma string XML) funciona na perfeição e não tenho qualquer tipo de problema, dai a minha pergunta acerca do tamanho do pedido. Grato desde já pela ajuda, Cumps! 😁 Link to comment Share on other sites More sharing options...
skcratch Posted October 20, 2009 at 10:01 PM Author Report Share #292617 Posted October 20, 2009 at 10:01 PM Viva! No código que apresentei no início do tópico, existe alguma forma de verificar se a informação foi ou não enviada com sucesso? Como o ciclo while "pendura" na leitura, gostaria de verificar se está a ocorrer algum erro durante o envio. Grato desde já pela ajuda, Cumps! 😛 Link to comment Share on other sites More sharing options...
jreis Posted October 21, 2009 at 05:17 PM Report Share #292743 Posted October 21, 2009 at 05:17 PM Do que vi na documentação, não há muito a verificar. Podes tentar o seguinte (é um pouco rebuscado, mas deverá funcionar): Usa a extenção Live HTTP headers do Firefox para criar um pedido igual ao que estás a tentar fazer no PHP, e enviá-lo para o servidor. Podes verificar os headers de resposta. Outra hipótese, ainda mais rebuscada, seria analizar o tráfego de rede usando um programa para tal (p. ex. wireshark em Linux), e verificar o que se passa. "Pensa positivo: tudo pode piorar" Link to comment Share on other sites More sharing options...
skcratch Posted October 22, 2009 at 08:40 AM Author Report Share #292839 Posted October 22, 2009 at 08:40 AM Viva! Sinceramente, não compreendo o que se passa, já que utilizo exactamente o mesmo método para fazer outros pedidos e tudo funciona bem. Vou utilizar o Wireshark para tentar perceber melhor a causa do problema. Grato desde já pela ajuda, Cumps! 😉 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now