Como isso é possível?
Existem algumas formas disso ser feito, nesse artigo, abordaremos o Long Polling.
Criaremos nesse artigo um pequeno chat, lembre-se que o intuito do artigo não é ensinar a fazer um chat, e sim, demostrar o funcionamento do Long Polling.
Vamos ao nosso arquivo poll.php, ele será responsável em trazer novas mensagens que foram enviadas pelo chat.
set_time_limit(0);
function poll($cur_line){
// Lê arquivo
$data = file_get_contents('chat.txt');
$lines = explode("\n", $data);
// Verifica se o número de linha é igual a linha atual ou se a linha 0 está vazia
if(count($lines) == $cur_line || empty($lines[0])){
// Coloca o script para dormir por 1 segundo
sleep(1);
return poll($cur_line);
}else{
$ret = array();
$ret['lines'] = array();
// Coloca somente as linhas que não foram lidas no vetor
for($cur_line;$cur_line < count($lines); $cur_line++){
$ret['lines'][] = $lines[$cur_line];
}
// Adciona a linha atual no vetor
$ret['cur_line'] = $cur_line;
// Encoda o vetor em json
return json_encode($ret);
}
}
echo poll($_POST['cur_line']);
Entendendo o poll.php
No arquivo poll há uma função que recebe como parâmetro o $cur_line, essa é a linha atual do chat. Cada mensagem estará em uma linha de um arquivo .txt.
Sem muito segredo, a função poll lê o arquivo chat.txt e verifica se há novas linhas no arquivo, caso negativo, ele coloca o programa para dormir durante 1 segundo, isso é muito importante para amenizar o gargalo de processamento.
Caso haja novas linhas, ele coloca as novas linhas em um vetor que é encodado para json.
Javascript:
var cur_line = 0;
var poll;
function get_messages(){
poll = $.ajax({
type: "POST",
url: "poll.php",
data: { 'cur_line' : cur_line },
dataType: "json",
success: function(json, textStatus, jqXHR) {
cur_line = json.cur_line;
// Insere linhas na tela
for(i=0;i' + json.lines[i] + '');
$("#chat #chat-content .messages").prepend(line);
}
},
complete: function(){
get_messages();
},
timeout: 30000
});
}
A função get_messages envia um post para o arquivo poll.php e imprime em uma lista o resultado(json) retornado e atualiza o número de linhas carregadas, que vem no json retornado.
Eu sempre recomendo que a conexão seja interrompida de tempo em tempo. No meu caso dixei o timeout em 30 segundos. Isso evita que, em caso de erros, o servidor fique com o processo travado.
Quando requisição é completada, eu chamo a função get_messages novamente, fazendo com que sempre haja uma conexão ativa com o servidor.
Com o Long Polling o chat sempre estará trazendo as novas mensagens de forma rápida, sem precisar ficar enviando milhares de requisições para o servidor.
Se quiser o projeto completo, eu subi no github.
Segue o link: https://github.com/carlosmaniero/Php-long-polling
Demonstração: http://www.livrodeoracao.com.br/dev/chat/index.php
2 comentários:
poderia fazer um exemplo de um long polling com banco de dados sql?
Muito obrigado amigo, vou estudar seu código para implementar num sistema.
Postar um comentário