Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wallace Maxters

While (true) pode parar um servidor?

Recommended Posts

hehe,

galera, fui testar um "chatezinho" (com long polling) na hospedagem da empresa (kinghost) e notei que, depois de acessar essa página de chat, o servidor para geral (carrega infinitamente).

 

Só volta quando eu faço uma gambiarra de trocar as configurações do php (porque parece que isso força o servidor a "reiniciar" o PHP).

 

alguém sabe a respeito?

 

o código é parecido com isso e é acessado via $.getJSON:

 

while(true){
if(...){
// se o tempo de modificação do arquivo for diferente do último, retorna um json
}
else{
sleep(2);
}
}

 

 

????

Compartilhar este post


Link para o post
Compartilhar em outros sites

A resposta para sua pergunta é não, porém, se você usar um laço de repetição com a lógica errada,

ele pode entrar em um loop infinito, como é o caso acima...

 

você colocou while (true) mas esse true nunca fica false, então ele vai ficar sempre parado nesse while e ainda por cima parar tudo durante o tempo definido no sleep.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue o código utilizado:

 

 

 <?php error_reporting(0);// arquivo cujo conteúdo será enviado ao cliente$dataFileName = 'chat.chat'; while ( true ){$requestedTimestamp = isset ( $_GET [ 'timestamp' ] ) ? (int)$_GET [ 'timestamp' ] : null; // o PHP faz cache de operações "stat" do filesystem. Por isso, devemos limpar esse cacheclearstatcache();$modifiedAt = filemtime( $dataFileName ); if ( $requestedTimestamp == null || $modifiedAt > $requestedTimestamp ){$data = file_get_contents( $dataFileName ); $arrData = array('content' => nl2br(strip_tags($data, '<div><b><p><i><code>')),'timestamp' => $modifiedAt); $json = json_encode( $arrData ); echo $json; break;}else{sleep( 2 );continue;}     }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah tah,

No lugar do seu true deve ter a sua condição porque se não ele sempre vai travar ai dentro e ficar em um loop infinito.+

Se você colocar false no lugar daquele true vai ver que ele não irá entrar em nenhuma ocasião.

Agora você precisa saber qual a condição para executar o laço de repetição, porque ai não existe nenhuma...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Há diversas técnicas alternativas ao while(true)

 

while(true), usávamos para fazer long pooling lá nos primórdios da web.. década de 1990 ~ 2003 +-

 

Se vc pegar o phpmyChat, que é dessa época do final da década de 90, poderá ver o uso do "loop infinito"

 

Dá uma fuçada no google "php long pooling"....

logo de cara vc encontrará links do stackoverflow e diversas outras boas fontes de estudo.

 

Aliás, migre para o forum do stack! a galera toda está indo pra lá

 

http://pt.stackoverflow.com/



#5... isso é uma técnica antiga para long pooling..

 

o intuito é justamente causar um loop infinito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faço long-polling para arquivos da seguinte forma:

 

 

$filePath = '/path/to/file';
$maxWait = 60000; // Espera máxima de 1 min
$startTime = microtime();
$lastModified = (int) $_GET['last_modified'];
 
do {
    usleep(500);
} while (filemtime($filePath) <= $lastModified
     && (microtime() - $startTime) < $maxWait);
 
// se foi modificado, retorna o conteúdo
if (filemtime($filePath) > $lastModified) {
    echo json_encode(file_get_contents($filePath));
    return;
} else {
    // senão, retorna a informação de que não houve modificação
    http_response_code(304); // ou header('HTTP/1.1 304 Not Modified') p/ versões do PHP < 5.4
    return;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal, Henrique!

 

Na verdade, eu não sabia que se tratava de algo ultrapassado while(true).

valeu pela dica!!!

 

 

Na verdade, eu queria mesmo era uma solução para chat (ouvi dizer que dá pra fazer em socket), mas pensei que a única solução que eu encontrei fosse essa... :assobiando:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.