Ir para conteúdo

POWERED BY:

Arquivado

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

Fernando Rafael

Conexão automática com ajax excede o limite de conexões do banco

Recommended Posts

Pessoal, com a ajuda de todos consegui resolver (pelo menos para meu propósito), postarei em breve o código e a explicação, colocarei no mesmo os créditos de todos, postem a forma que desejam que seus nomes sejam colocados (Todos que quiserem, mesmo os que deram apenas alguns palpites) ou me mandem um e-mail: fernandocontatos2014@gmail.com

 

O código que usei também tem créditos de outros autores de diversos fóruns... Vou respeitar seus direitos também...

 

Abraços a todos! Recomendo seguir este tópico, pois futuramente vou fazer outras perguntas para melhorar ainda mais esta solução, quem quiser melhorar ainda mais o código estará liberado, mas gostaria que o postassem aqui para que todos desfrutem...

 

Aguardo suas respostas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fernando Rafael,

 

Posta no github, assim quem tiver tempo de melhorar te envia um pullrequest e já fica tudo lá registrado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal desculpa a demora, o código a baixo que estou postando foi baseado na explicação de Gabriel Heming que me ajudou a entender e o conceito de long polling, William Bruno deu as idéias de busca (dentre elas a que estou usando no exemplo (long polling)) e as funções Ajax foram tiradas deste site: http://rafaelcouto.com.br/consulta-interativa-sem-refresh-com-ajax/ , agradeço também os demais participantes deste fórum.

 

No meu caso estou usando o conceito de long polling para fazer consultas automáticas no banco de dados.

Segue os arquivos (códigos):

 

 

---------------------------------------index.html-------------------------------------

 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Teste long polling</title>

<script type="text/javascript">

var permicao = 1; //Variavel que indicara a permicao da funcao "buscar_auxiliar()"
var id_usuario = 1; //Indica um usuario (valor que sera usado no banco para pesquisas).

//Funcao que chamara o arquivo "buscar.php" para varrer o banco
function buscar(binario){
var busca_ajax;

//Criamos uma "div" com uma mensagem e colocamos tudo dentro da tag "p".
var Div = document.createElement("div");
Div.innerHTML = "<font color= '#FF00FF'><b>Funcao 'buscar(binario)' ativada!</b></font><br>";
document.getElementById("p").appendChild(Div);

//Verificao navegador
if(window.XMLHttpRequest) {
busca_ajax = new XMLHttpRequest();
}

else if(window.ActiveXObject) {
busca_ajax = new ActiveXObject("Microsoft.XMLHTTP");
}

// Arquivo PHP juntamente com o valor digitado no campo, e a função "escape()" converte os caracteres especiais em hexadecimal iniciado por "%".
var url = "buscar.php?verifica=ok&binario="+escape(binario)+"&usuariologado="+id_usuario;

// Chamada do metodo open e envia os dados para o arquivo buscar.php.
busca_ajax.open("Get", url, true);

// Quando o objeto recebe o retorno, chamamos a seguinte função;
busca_ajax.onreadystatechange = function(){

//Aguarda o ajax executar
if(busca_ajax.readyState == 4 && busca_ajax.status == 200) {

//Resposta retornada pelo "buscar.php" via "echo"
var resposta = busca_ajax.responseText;

//Verifica se e um conteudo vazio.
if(resposta != "" && !(resposta.match(/^\s+$/))){

//Criamos uma "div" com o conteudo encontrado dentro e colocamos tudo dentro da tag "p".
var Div = document.createElement("div");
Div.innerHTML = resposta;
document.getElementById("p").appendChild(Div);
permicao = 1; //Coloca 1 para que a função "buscar_auxiliar()" consiga chamar novamente esta função ("buscar(binario)").
}

else{
permicao = 1; //Caso algo de errado no "if" coloca a permicao para "1", permitindo outra busca nesta funcao ("buscar(binario)") chamada pela função "buscar_auxiliar()"
}

busca_ajax.send(null); //Limpa a variavel para que possa ser novamente criado na proxima execucao
}
}
busca_ajax.send(null); //Limpa a variavel para que possa ser novamente criado na proxima execucao
}

//------------------------------------------------------------------------------------
function buscar_auxiliar(){ //Funcao auxiliar que serve para chamar a funcao "buscar(binario)", mas impedindo que a mesma seja chamada novamente antes de realizar o pedido de busca anterior.

if(permicao != 0){ //Verifica se tem permicao para chamar a funcao "buscar(binario)" (para nao chamar a outra funcao antes que a mesma termine as buscas).
permicao = 0; //Altera a variavel "permicao" para que este "if" não permita que a funcao "buscar(binario)" não seja chamada antes do tempo.
buscar(0); //Chama a funcao "buscar(binario)".
}

}

//------------------------------------------------------------------------------------
var bloqueio= 0; //Variavel usada dentro da funcao "busca_automatica()", para que o botao "busca_ajax automática" chame a funcao "busca_automatica()" apenas uma vez.
function busca_automatica(){ //Funcao para iniciar as buscas automaticas.
if(bloqueio == 0){ //Verifica se a variavel esta com o valor original, evitando que o comando "window.setInterval" seja chamado mais de uma vez.
window.setInterval("buscar_auxiliar()", 5000); //Funçao ativada automaticamente de tempo em tempo.
bloqueio = 1; //Muda o valor da variavel, impedindo que o "if" deixe executar novamente o comando "window.setInterval".
}
}

</script>

</head>

<body>
<input type="button" value="Consulta ajax manual" onclick="buscar_auxiliar()"/>
<input type="button" value="Consulta ajax automática" onclick="busca_automatica()"/>
<p ID="p" NAME="p">
</p>

</body>
</html>

---------------------------------------fim index.html-------------------------------------

 

---------------------------------------buscar.php-------------------------------------

 

<?php
//Determina o tipo da codificação da pagina (Reconhece os acentos no banco)
header("content-type: text/html; charset=iso-8859-1",true);

// Arquivo de conexao com o banco
include("conn.php");

/**
* tempo de sleep do sistema
* quanto maior o tempo, menos processamento é utilizado,
* entretanto tem um maior o tempo de espera para a resposta
**/
$sleepTime = 5;//segundos

/** tempo de execução definido para o script **/
$executionTime = 100;//segundos

/** caso não estiver em safe mode, pode realizar alterações no tempo de execução do script **/
if(!ini_get('safe_mode')) {

/** verifica se o limite de tempo para execução de script definido no servidor é menor que o definido em $executionTime **/
if(ini_get('max_execution_time') < $executionTime) {

/** altera o limite de processamento para o tempo definido em $executionTime **/
set_time_limit($executionTime);
} else {

/** caso o tempo já definido for maior, utiliza-se dele para os testes **/
$executionTime = ini_get('max_execution_time');
}
} else {

/** caso servidor estiver em safe mode, recupera o tempo de execução definido pelo servidor **/
$executionTime = ini_get('max_execution_time');
}

//executa caso a função URL envie 'ok' como paramero evitando execuções caso o arquivo seja chamado por outros meios.
if($_GET['verifica'] == 'ok'){

// Recebe o valor enviado, a função "urldecode()" converte valor hexadecimal antecipado por "%" para caracteres especiais (desfaz o comando do javascript).
$binario = urldecode($_GET['binario']);
$usuariologado = urldecode($_GET['usuariologado']);

// Procura as mensagens que estiverem com status "0" e que pertençam ao usuario logado.
$sql = mysql_query("SELECT ID, MENSAGEM FROM teste WHERE STATUS = '".$binario."' LIMIT 1");
$pesquisa = mysql_fetch_object($sql);
$ID= $pesquisa->ID;

//Mostra a hora e o ID do banco em que aconteceu o evento
echo "<font color = '#00FF00'><b>IF</b></font>, hora: ".$hr = date("H:i:s", mktime(gmdate("H")-3, gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y")))." // ID no Banco: ".$ID."<br>" ;
}

$time = time();
//$time = $_SERVER['REQUEST_TIME']; //Outra forma de pegar o tempo limite do servidor;
while($ID == 0) {
sleep($sleepTime);

// Procura as mensagens que estiverem com status "0" e que pertençam ao usuario logado.
$sql = mysql_query("SELECT ID, MENSAGEM FROM teste WHERE STATUS = '".$binario."' LIMIT 1");
$pesquisa = mysql_fetch_object($sql);
$ID= $pesquisa->ID;

echo "<font color = '#0000FF'><b>WHILE</b></font>, hora: ".$hr = date("H:i:s", mktime(gmdate("H")-3, gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y")))." // ID no Banco: ".$ID."<br>" ;

/**
* o long polling irá parar sempre que o arquivo for modificado
* ou que o tempo de execução do script estiver próximo do fim do limite de tempo de exceução do servidor
* Essa verificação evita que o PHP responda com timeout
**/
if((time() - $time) >= ($executionTime - ($sleepTime + 1))) {

//Adicionei este campo para mostrar na tela que o tempo limite acapou...
echo "<font color = '#FF0000'><b>WHILE (limite excedido)</b></font>, hora: ".$hr = date("H:i:s", mktime(gmdate("H")-3, gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y")))." // ID no Banco: ".$ID."<br>" ;
break;
}
}

//exibe a informacao que esta na coluna MENSAGEM.
echo "<b>MENSAGEM: </b>";
echo "$pesquisa->MENSAGEM";
echo "<br/>";
echo "<b>--------------------------------------------------------------//-------------------------------------------------------------</b><br>";

//OBS 1: Para controlar o que sera mostrado na tela bastar apagar ou manipular o comando "echo" deste arquivo.
//OBS 2: Todos os comentarios em que se encontra entre /** **/ sao do usuario "Gabriel Heming" do forum "Imasters"

//Coloca "1" no status para não buscar novamente.
mysql_query("UPDATE teste SET STATUS= '1' WHERE ID= '".$ID."' ");
mysql_close($conexao);
?>

---------------------------------------Fim buscar.php-------------------------------------

 

---------------------------------------conn.php-------------------------------------

 

<?php

$host = "localhost"; //Seu servidor
$usuario = "root"; //Seu usuario
$senha = "123456"; //Sua senha
$banco = "polling"; //Banco de exemplo

$conexao = mysql_connect($host, $usuario, $senha);
$db = mysql_select_db($banco, $conexao) or die("Erro ao conectar ao bando de dados");
?>

 

---------------------------------------Fim conn.php-------------------------------------

 

---------------------------------------BANCO DE DADOS-------------------------------------

 

# MySQL-Front 5.1 (Build 4.13)

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */;
/*!40101 SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */;
/*!40103 SET SQL_NOTES='ON' */;


# Host: localhost Database: polling
# ------------------------------------------------------
# Server version 5.5.23

USE `polling`;

#
# Source for table teste
#

CREATE TABLE `teste` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`MENSAGEM` varchar(255) DEFAULT NULL,
`STATUS` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

#
# Dumping data for table teste
#

INSERT INTO `teste` VALUES (1,'Parabéns','0');
INSERT INTO `teste` VALUES (2,'Fernando Rafael da Silva','0');
INSERT INTO `teste` VALUES (3,'Teste com sucesso','0');

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

 

---------------------------------------FIM BANCO DE DADOS-------------------------------------

 

 

Espero que este conteudo seja útil.... : )

 

Contato: fernandocontatos2014@gmail.com

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.