Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Colegas, estou usando um script de bate papo em PHP. Quando faço testes locais o mesmo se comporta sem problemas, no entanto, quando está no ar, sinto que existe uma instabilidade no servidor. O site todo fica indisponível. Se o usuário escreve um comentário, as vezes fica mais de 2 minutos para o mesmo ser enviado ao servidor e mostrado na página. A banda de rede disponível é suficientee não vejo gargalo. Ocorreu-me a possibilidade de ser alguma parte do script, que descrevo abaixo. Alguém podería me dar uma luz?
Chat.php
<?php
class Chat{
private $nome;
private $mensagem;
private $tempoLimite;
public function __construct(){
$this->tempoLimite = TEMPO_LIMITE;
}
public function setNome($nome){
$this->nome = $nome;
}
public function getNome(){
return $this->nome;
}
public function setMensagem($msg){
$this->mensagem = $msg;
}
public function getMensagem(){
return $this->mensagem;
}
public function inserir(){
$strSQL = "INSERT INTO chat SET nome = ?, mensagem = ? , datahora = NOW()";
$stmt = BD::getConn()->prepare($strSQL);
$data = array($this->getNome(), $this->getMensagem());
return $stmt->execute($data);
}
public function existeNome(){
$strSQL = "SELECT COUNT(nome) FROM chat WHERE nome = ?";
$stmt = BD::getConn()->prepare($strSQL);
$data = array($this->getNome());
$stmt->execute($data);
return ($stmt->fetchColumn() > 0) ? true : false;
}
public function excluir(){
$strSQL = "DELETE FROM chat WHERE DATE_ADD(datahora, INTERVAL {$this->tempoLimite} DAY) < NOW()";
$stmt = BD::getConn()->query($strSQL);
}
public function listar(){
$strSQL = "SELECT * FROM chat ORDER BY id DESC";
return BD::getConn()->query($strSQL);
}
}
<?php
require('config/config.php');
$chat = new Chat();
switch ($_POST['acao']){
case 'inserir':
$chat->excluir();
$chat->setNome($_COOKIE['nome']);
$chat->setMensagem(filter_input(INPUT_POST, 'mensagem'));
if($chat->inserir()){
printf('<p class="ativo">[%s] - %s</p>', $chat->getNome(), $chat->getMensagem());
}
break;
case 'atualizar':
foreach($chat->listar() as $v){
$ativo = ($v['nome'] == $_COOKIE['nome']) ? ' class="ativo"' : '';
printf('<p%s>[%s] - %s</p>', $ativo, $v['nome'], $v['mensagem']);
}
break;
}Mostre o lado do cliente .. javascript para ser específico
Dê uma olhada nesse tópico. Há um exemplo de chat em seu conteúdo que pode te ajudar bastante:
:seta: http://forum.imasters.com.br/topic/454444-long-polling/
Colegas, pelo que vi no post sobre long polling, eu entrei numa fria.....
mas segue todo o código envolvido no projeto, ok? Imagino que a página a seguir tenha muita influência sobre as requisições as server.....
define.php
<?php
define('HOST', 'localhost');
define('USER', 'root');
define('PASS', '');
define('BD', 'nomedoBanco');
define('DSN', 'mysql:host='.HOST.';dbname='.BD);
[b]define('TEMPO_LIMITE', 1);[/b]
bd.class.php
<?php
class BD{
private static $conn;
private function __construct(){}
public static function getConn(){
if(is_null(self::$conn)){
self::$conn = new PDO(DSN, USER, PASS);
}
return self::$conn;
}
}
Chat.class.php
<?php
class Chat{
private $nome;
private $mensagem;
private $tempoLimite;
public function __construct(){
$this->tempoLimite = TEMPO_LIMITE;
}
public function setNome($nome){
$this->nome = $nome;
}
public function getNome(){
return $this->nome;
}
public function setMensagem($msg){
$this->mensagem = $msg;
}
public function getMensagem(){
return $this->mensagem;
}
public function inserir(){
$strSQL = "INSERT INTO chat SET nome = ?, mensagem = ? , datahora = NOW()";
$stmt = BD::getConn()->prepare($strSQL);
$data = array($this->getNome(), $this->getMensagem());
return $stmt->execute($data);
}
public function existeNome(){
$strSQL = "SELECT COUNT(nome) FROM chat WHERE nome = ?";
$stmt = BD::getConn()->prepare($strSQL);
$data = array($this->getNome());
$stmt->execute($data);
return ($stmt->fetchColumn() > 0) ? true : false;
}
public function excluir(){
$strSQL = "DELETE FROM chat WHERE DATE_ADD(datahora, INTERVAL {$this->tempoLimite} DAY) < NOW()";
$stmt = BD::getConn()->query($strSQL);
}
public function listar(){
$strSQL = "SELECT * FROM chat ORDER BY id DESC";
return BD::getConn()->query($strSQL);
}
}
load.php
<?php
function __autoload($classe){
$pagina = sprintf('classes/%s.class.php', $classe);
if(file_exists($pagina)){
require_once($pagina);
}
}
syle.css
body{background:#333}
h1 {
color: #fff;
text-align: center;
}
#erro{
width:400px;
margin:0 auto;
background:#fff;
color:#f00;
text-align:center;
}
#frm-login {
width: 400px;
margin: 0 auto;
background:#fff;
}
#frm-login fieldset{
border:1px solid #ccc;
padding:10px ;
}
#frm-login a{
color:#333;
display:block;
text-align:center;
}background:#ccc;
}
#frm-login label input{
padding:5px 0;
width:250px;
border:1px solid #ccc;
-moz-border-radius:5px;
}border-color:#333;
}padding:5px 10px;
cursor:pointer;
}
#frm-msg {
width: auto;
margin-top: 0;
margin-right: auto;
margin-bottom: 0;
margin-left: auto;
height: auto;
}width:400px;
display:block;
float:left;
}display:block;
color:#CCCCCC;
}width:500px;
border:1px solid #ccc;
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:5px;
overflow:auto;
height: 100px;
float: none;
position: relative;
left: auto;
top: auto;
right: auto;
bottom: auto;
visibility: visible;
}border-color:#333;
}
#frm-msg #submit{
float:left;
margin-top:auto;
padding: 5px;
position: relative;
width: auto;
height: auto;
}
#painel {
width: 500px;
overflow: scroll;
margin-right: auto;
margin-bottom: 0;
margin-left: auto;
background-color: #FFFFFF;
position: relative;
float: left;
height: 200px;
visibility: visible;
top: 0px;
right: 0px;
margin-top: auto;
}border-bottom:1px solid #e5e5e5;
color:#777;
margin:0;
visibility: visible;
padding-top: 0px;
padding-right: 0;
padding-bottom: 0px;
padding-left: 0;
}auth.php
<?php
if(!isset($_COOKIE['nome'])){
header('location:index.php');
}
chat-index.php
<?php
include("auth.php");
require('config/config.php');
$chat = new Chat();
header('Content-Type: text/html; charset=ISO-8859-1',true) ;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
<script type="text/javascript" src="js/chat.js"></script>
<title>Culto ao vivo com chat</title>
<style type="text/css">
<!--
body {
background-color: #333333;
}
-->
</style>
<style type="text/css">
<!--
.style2 {color: #CCCCCC}
.style3 {color: #FF0000}
.style6 {
font-size: 18px;
font-weight: bold;
}
-->
</style>
<link href="css/style.css" rel="stylesheet" type="text/css" />
<style type="text/css">
<!--
.style7 {font-size: 7px}
-->
</style>
</head>
<body>
<table width="974" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="11" rowspan="3" bgcolor="#666666"> </td>
<td colspan="3" bgcolor="#666666"></span>
<div align="center"><span class="style3 style6"><?php echo $_COOKIE['nome']?> </span>, <span class="style2">Bem Vindo ao nosso culto online </span> </span></div></td>
<td width="10" bgcolor="#666666"> </td>
</tr>
<tr>
<td width="432" height="325" valign="top"> </td>
<td width="15" bgcolor="#666666"> </td>
<td width="512"><div id="painel">
<?php
foreach($chat->listar() as $v){
$ativo = ($v['nome'] == $_COOKIE['nome']) ? ' class="ativo"' : '';
printf('<p%s>[%s] - %s</p>', $ativo, $v['nome'], $v['mensagem']);
}
?>
</div>
<form action="" method="post" id="frm-msg">
<fieldset>
<label>
<span class="style7">Digite sua Mensagem</span>
<br />
<textarea name="mensagem" id="mensagem" cols="70" rows="5"></textarea>
</label>
</fieldset>
</form>
<input type="button" id="submit" value="Enviar" />
<div align="center"></div></td>
<td rowspan="2" bgcolor="#666666"> </td>
</tr>
<tr>
<td height="75" colspan="2" bgcolor="#666666"><p align="center"></p> </td>
<td height="75" bgcolor="#666666"> </td>
</tr>
</table>
</body>
</html>
index.php
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$nome = trim(filter_input(INPUT_POST, 'nome'));
if(empty($nome)){
$erro = 'Nome é obrigatório';
}else{
require("config/config.php");
$chat = new Chat();
$chat->setNome($nome);
if($chat->existeNome()){
$erro = 'Já existe alguém usando esse nome';
}else{
setcookie('nome', $chat->getNome(), time()+3600*24*TEMPO_LIMITE);
header('location:chat-index.php');
}
}
}
?>
<!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" xml:lang="pt-br">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Entrar no Sistema</title>
<link rel="stylesheet" type="text/css" href="css/style.css" media="all" />
</head>
<body>
<h1 align="center">Entre no Culto ao Vivo</h1>
<?php
if(isset($erro)){
printf('<p id="erro">%s</p>', $erro);
}
?>
<form action="" method="post" id="frm-login">
<?php if(isset($_COOKIE['nome'])): ?>
<a href="chat-index.php">Caso deseje utilizar o mesmo nome, clique aqui</a>
<?php endif;?>
<fieldset>
<label>
<span>Nome</span>
<input type="text" name="nome" id="nome" />
</label>
<input type="submit" class="btn" value="Entrar" />
</fieldset>
</form>
<h1 align="center"><img src="../Imagem/barca.png" alt="" width="199" height="43" /></h1>
</body>
</html>
Talvez fosse mais fácil postar os arquivos em algum servidor, mas não tenho nenhuma conta ok?
se alguém puder me auxiliar , serei muito grato
Mais uma vez você não postou o arquivo js nem o erro que aparece.
Desculpe-me
este é o arquivo chat.js
$(function(){
//inserir
$("#submit").click(function(){
var msg = $("#mensagem").val();
msg = $.trim(msg);
if(msg != ''){
$.post('chat.php',
{
mensagem : msg,
acao : 'inserir'
}, function(retorno){
$("#painel").prepend(retorno);
$("#mensagem").val('');
});
}
});
//atualizar
setInterval(function(){
$.post('chat.php',
{
acao : 'atualizar'
}, function(retorno){
$("#painel").html(retorno);
});
}, 5000);
});
rolando no servidor online, não apareçem mensagens de erro. Ocorre apenas um bloqueio do site. por exemplo, se eu digito uma mensagem, leva muito tempopara apareçer no painel. dai , o cliente acha que a mensagem não foi enviada e fica apertando submit por seguidas vezes. Quando o servidor "libera" as mensagens enviadas por este usuário aparecem repetidas. este é o erro.
COlegas
Vou utilzar o sistema do livezila, e estudar uim pouco sobre o assunto, ok?
valeu
Olá brother, caso queira dar uma olhada neste aqui, é bem simples e nunca vi dando problema de lentidão, até hoje fiz alguns testes nos clientes e teve lugares com 3 atendentes e 15 clientes simultaneamente e nao deu problema, ficou quase inperceptivel as requisições. Também pode ser algum problema na sua revenda essas instabilidades e não tem muito haver com o code em si :thumbsup:
Colega, boa tarde
Desculpe-me pela ignorância, mas o usuário e senha não batem....
Aí, dá uma olhada :seta: http://forum.imasters.com.br/topic/455949-collectivesense/page__view__findpost__p__1805372
Pessoal, apenas atualizando o link do chat de demonstração:
Chat não é só php tem no minimo mais uma grande parte desse código em javascript/ajax poste ele.