Ir para conteúdo

Arquivado

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

Vales & Dores

Chat Long Polling

Recommended Posts

esta registrando no BD esta apagando as msg a cada um minuto, mas nao esta pegando as msg que mandamos quem poder falar qual seria a linha ?

sera mais um ganho para todos vamos la amigos.

 

<?php

// Conecta
include_once('../conectar_bd.php');

// Cria a tabela de chat, caso ainda não exista
$stmt = $dsn->prepare("
   CREATE TABLE IF NOT EXISTS chat (
       id INT UNSIGNED NOT NULL AUTO_INCREMENT,
       mensagem VARCHAR(400) NOT NULL,
       timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
       PRIMARY KEY (id)
   ) ENGINE=MEMORY
");
$stmt->execute(); 
var_dump($mensagem);


// Salva a mensagem se ela estiver sendo postada
if(isset($_POST['mensagem'])){
   // Limpa mensagens antigas
   $stmt = $dsn->prepare("DELETE FROM chat WHERE timestamp < NOW() - INTERVAL 1 MINUTE");
$stmt->execute();
   // escapa a string
   $mensagem = mysql_real_escape_string($_POST['mensagem']);

   // insere na tabela chat
   $stmt = $dsn->prepare("INSERT INTO chat(mensagem) VALUES ('$mensagem')");
$stmt->execute();

   // pára o processamento
   exit;

}

// Cliente quer receber mensagens mais novas que o id fornecido
elseif(isset($_GET['ultimo_id'])){
   // desabilita o time limit porque queremos um loop infinito logo abaixo
   set_time_limit(0);

   // prepara o número para a query
   $ultimo_id = (int)$_GET['ultimo_id'];

   // mensagens que serão retornadas ao cliente
   $mensagens = array();

   // vai tentando achar mensagens até conseguir
   while(true){
       // pega as últimas 10 mensagens
       $stmt = $dsn->prepare("SELECT id, mensagem FROM chat WHERE id > $ultimo_id ORDER BY id DESC LIMIT 10");
	$stmt->execute();

	$obj = $stmt->rowCount();

       // se achar alguma mensagem
       if($obj){
           // preenchemos o array com as mensagens
            $row = $stmt->fetchAll();

			foreach($row as $ver)
			{
			$mensagens[] = $ver;
			}



           // coloca as mensagens em ordem, já que fizemos order by id DESC
           $mensagens = array_reverse($mensagens);

           // pára o loop infinito
           break;
       }
       // se não tiver mensagem nova ainda
       else{
           // pausa o loop infinito um pouquitinho
           usleep(250);
       }
   }

   // chegando até aqui, podemos retornar o array $mensagens como json
   echo json_encode($mensagens);

   // e terminar esta requisição pro cliente poder ler o json
   exit;
}

// se chegamos até aqui, o cliente simplesmente quer usar o chat boladão

// envia header com encoding utf-8
header("Content-type: text/html; charset=utf-8");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>chatildis!</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="author" content="garotosopa"/>
<script type="text/javascript">
// <![CDATA[

// variável que vai guardar o id da última mensagem que recebemos
var ultimo_id = 0;

// variável que será o elemento da div das mensagens
var chat;

// variável que será o elemento da caixa de texto de mensagem
var mensagem;

// variável que será o objeto XHR das mensagens recebidas
var xhr_chat;

// montamos o xhr que recebe mensagens em browsers bacanas
if( window.XMLHttpRequest ){
   xhr_chat = new XMLHttpRequest();
}
// ou montamos o xhr para o internet explorer
else if ( window.ActiveXObject ){
   xhr_chat = new ActiveXObject("Microsoft.XMLHTTP");
}

// função callback para qualquer novidade na requisição de mensagens
function processar(){
   // quando a requisição estiver completa
   if ( xhr_chat.readyState == 4 ) {
       // se houve sucesso na requisição
       if ( xhr_chat.status == 200 ) {
           // transforma o texto retornado em json
           var json = eval('(' + xhr_chat.responseText + ')');

           // le cada item do array retornado por json
           for (i in json) {
               // acessa a mensagem da iteração atual
               var mensagem = json[i];

               // caso não tenha mensagens validas
               if( ! mensagem.mensagem ){
                   // não queremos ter erro de javascript
                   return;
               }

               // escapa tags html da mensagem recebida
               var texto = mensagem.mensagem.replace(/</g, '<');
                   texto = texto.replace(/>/g, '>');

               // criamos um parágrafo pra cada mensagem retornada
               var p = document.createElement('p');
                   p.innerHTML = texto;

               // adicionamos o parágrafo na div de mensagens
               chat.appendChild(p);
           };

           // id da última mensagem para depois pegar apenas as mais novas
           if ( json[json.length-1] ){
               // pega a propriedade id da última mensagem
               ultimo_id = json[json.length-1].id;
           }

           // coloca a barra de rolagem no final
           chat.scrollTop = chat.scrollHeight;
       }

       // sempre que completar a requisição, criaremos uma nova
       setTimeout(atualizar, 250);
   }
};

// função que pede as mensagens mais novas que o id que temos
function atualizar(){
   // enviaremos para o próprio arquivo e acrescentamos o ultimo id
   xhr_chat.open('GET', location.pathname + '?ultimo_id=' + ultimo_id, true);

   // associamos nossa função de callback 
   xhr_chat.onreadystatechange = processar;

   // e então enviamos a requisição sem nenhum parâmetro extra
   xhr_chat.send(null);
}

// espera carregar a página
window.onload = function(){
   // guarda o elemento da div das mensagens
   chat = document.getElementById('chat');

   // guarda o elemento da caixa de texto de mensagem
   mensagem = document.getElementById('mensagem');

   // adiciona evento ao formulário para fazer o envio por ajax
   document.getElementById('envio').onsubmit = function(){
       // pega o texto digitado
       var texto = mensagem.value;

       // tira os espaços do início e fim
       texto = texto.replace(/^\s*/, '');
       texto = texto.replace(/\s*$/, '');

       // se o texto estiver vazio, nem envia
       if( texto == '' ){
           return false;
       }

       // montamos o xhr para enviar mensagem por browsers joinhas
       if( window.XMLHttpRequest ){
           var xhr_envio = new XMLHttpRequest();

       // ou montamos o xhr para enviar mensagem pelo internet explorer
       }else if ( window.ActiveXObject ){
           var xhr_envio = new ActiveXObject("Microsoft.XMLHTTP");
       }

       // enviaremos a mensagem por post para nós mesmos, assincronamente
       xhr_envio.open("POST", location.pathname, true);

       // definimos a requisição como envio de formulário
       xhr_envio.setRequestHeader
           ('Content-Type', 'application/x-www-form-urlencoded');

       // e então escapamos e enviamos o texto
       xhr_envio.send( 'mensagem=' + encodeURIComponent(texto) );

       // limpa e foca a caixa de texto
       mensagem.value = '';
       mensagem.focus();

       // não submete o formulário tradicionalmente
       return false;
   };

   // foca a caixa de texto ao carregar a página
   mensagem.focus();

   // começa a consultar as atualizações
   atualizar();
};
//]]>
</script>
<style type="text/css">
body {
   font-family: sans-serif;
   font-size: 12px;
   margin: 0;
}

h1 {
   border-bottom: 1px solid #a4a4a4;
   background: #eaeaea;
   color: #333;
   padding: 1em;
   margin: 0;
}

#chat {
   border: 1px solid #a4a4a4;
   padding: 1em;
   margin: 1em;
   height: 25em;
   overflow: auto;
}

#mensagem {
   min-width: 50em;
}

label, input {
   padding: 0.5em;
}
</style>
</head>
<body>
<h1>chatildis!</h1>
<div id="chat">
   <p>It's only the chatildis ultimate chat ultra, baby!</p>
   <p>
       O único capaz de derrubar seu servidor com conexões abertas e
       tabelas na memória... *sigh*
   </p>
</div>
<form id="envio" method="post" action="">
<p>
   <label for="mensagem">Mensagem:</label>
   <input type="text" name="mensagem" id="mensagem" maxlength="380" />

   <input type="submit" name="enviar" value="Enviar" />
</p>
</form>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele tem PHP e Ajax sim e eu sou um zero em Ajax.

 

 

E sobre comparação e verdade o garotosopa e muito bom em dar a ajuda que muitos tem medo.

 

O que vocês me dizem?

da pra ajudar ? B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

primeiro entenda q ajax eh diferente do long polling, ok? completamente diferente

 

segundo coloque este php num ourtro arquivo separado, você pode aumentar o processamento do jeito q esta...

 

terceiro depure o q o ajax esta mandando pro servidor, como fazer isso? instale o firefox, instale no firefox o firebug, ative-o e va a aba redes, recarregue a pagina e veja o ajax mandando dados pro servidor..retorne o resultado...

 

---------

 

@Igor.php

 

Só para constar:

Sim long polling e ajax são coisas distintas, mas podem ser usadas em conjunto. Neste caso, faz sentido usar long polling com ajax (na verdade, em chats são comumente usados em conjunto):

 

http://en.wikipedia.org/wiki/Push_technology#Long_polling

http://blog.perplexedlabs.com/2009/05/04/php-jquery-ajax-javascript-long-polling/

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É, realmente parece não haver nenhum long pooling ali...

O que ele faz é basicamente realizar uma nova requisição a cada 250 ms...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa como vocês estão proativos.

 

Muitos link para estudar sobre o polling, e agora eu to sabendo que isso que eu postei não é o verdadeiro polling, vou estudar e aprender.

Obrigado a todos

 

 

Pergunta, a forme de registrar as msg no BD apagar elas com time, e chamar todas na tela, não seria melhor que polling ?

quero dizer: a ideia não é a mesma?

 

 

OBS: temos um novo amigo hufersil, pelomenos para mim ele é novo.

Obrigado pela sua ajuda (hufersil), desculpe a pergunta se incomoda mas qual á origem de seu nick?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Pergunta, a forme de registrar as msg no BD apagar elas com time, e chamar todas na tela, não seria melhor que polling ?

quero dizer: a ideia não é a mesma?

 

Ahn??? Explica isso melhor...

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Pergunta, a forme de registrar as msg no BD apagar elas com time, e chamar todas na tela, não seria melhor que polling ?

quero dizer: a ideia não é a mesma?

 

de forma alguma, registrar as mensagens no db, eh uma requisicao e acao do banco de dados, o long polling eh uma forma de requisicao ao servidor, independente de ter ou nao banco de dados por tras...

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.