Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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);
}
}
????
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;} }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...
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á
#5... isso é uma técnica antiga para long pooling..
o intuito é justamente causar um loop infinito.
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; return;
}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:
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.