Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Will871

JQuery Isso seria muito pesado ?

Recommended Posts

Boa noite, pessoal.

Estou criando um sistema de notificação, ele já funciona, mas minha preocupação é em relação ao peso que isso terá, caso queiram ver meu código, ai está:

Ele inicia aqui:

  var ver = function(){
    verNotificacao();
  };
  setInterval(ver, 1000);
//o intervalo poderia variar até 5000, talvez até mais

durante o intervalo, ele estará chamando o seguinte processo:

    function verNotificacao(){
        var notificacao = $.ajax({
            type: "POST",
            dataType: "html",
            url: "class/chamar.php",
            data:{notificacao:1}
        });
        notificacao.done(function(retorno){
            $('#notificacao').html(retorno);
        });
    }

Aqui está o arquivo chamar.php (ele seria o controller):

if(isset($_POST['notificacao'])):$basico->notificacao();endif;

E aqui ele executa o método solicitado pelo chamar.php e retorna os valores, caso tenha alguma notificação:

	public function notificacao(){ // Notificação das mensagens
        if(isset($_SESSION['id']) && $_SESSION['admin'] == 1)
            $sql = "SELECT nome, sobrenome, mensagem, foto, id_chat FROM chat_usu LEFT JOIN chat ON chat.chat = chat_usu.usu_chat LEFT JOIN usuarios ON chat.id_usuario = usuarios.id_usu WHERE bol_notifica = 1 AND bol_tipo = 0 ORDER BY id_chat ASC";
        elseif(isset($_SESSION['id']) && $_SESSION['admin'] == 0)
            $sql = "SELECT nome, sobrenome, mensagem, foto, id_chat FROM chat_usu LEFT JOIN chat ON chat.chat = chat_usu.usu_chat LEFT JOIN usuarios ON chat.id_usuario = usuarios.id_usu WHERE bol_notifica = 1 AND bol_tipo = 1 AND id_dono = {$_SESSION['id']} ORDER BY id_chat ASC";
        else 
            $sql = "SELECT nome, sobrenome, mensagem, foto, id_chat FROM chat_usu LEFT JOIN chat ON chat.chat = chat_usu.usu_chat LEFT JOIN usuarios ON chat.id_usuario = usuarios.id_usu WHERE bol_notifica = 1 AND bol_tipo = 1 AND id_dono = '{$_SERVER['REMOTE_ADDR']}' ORDER BY id_chat ASC";
        $notifica = $this->executar($sql);
        foreach ($notifica as $tudo){?>
            <script type="text/javascript">
                //Aqui ele chama o primeiro código que passei, ele gera a notificação
                notificacao('<?=$tudo['nome'];?> <?=$tudo['sobrenome'];?>', '<?=$tudo['mensagem'];?>', '<?php if($tudo['foto'] != null) echo $tudo['foto']; else echo 'images/services/services1.png'; ?>');
            </script>
            <?php $this->attNotificacao($tudo['id_chat']); 
        }
    }

    public function attNotificacao($id){ // Atualizador de notificação
        $sql = "UPDATE chat SET bol_notifica = 0 WHERE id_chat = {$id}";
        $this->executar($sql);
    }

Minha dúvida é a seguinte:

Executando todo esse código com o intervalo entre 1 a 5 segundos seria muito pesado ? Isso poderia gerar alguns problemas ?

Eu não tenho muita noção do peso que o ajax gera, por isso sempre fico com receio de exagerar nele, vale lembrar que eu tenho outras execuções que serão feitas nas páginas, e todas as páginas do site vão executar o código acima, porém só esse código terá um setInterval().

Estou também aceitando sugestões, caso tenham alguma forma melhor de fazer algo que gere notificação.

Desde já, agradeço pela ajuda!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Will871 Creio que não tem problema  em usar  um intervalo assim.. veja o caso do facebook, a cada segundo é atualizado o feed além do carregamento por demanda.

 

O que eu vi no seu código é a respeito do banco de dados.

Talvez você melhoraria o desempenho dele aplicando as "NF" e otimizando o banco de dados.

Por exemplo usar o inner join no lugar de left join,   ter as tabelas com os relacionamentos corretos e índices definido na tabela controladora..

 

Fora isso, a parte do Javascript está legal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@DiF Entendi, então não vou mexer no javascript, mas você poderia mandar aqui um dos meus sql da forma que recomenda ? Ai eu usaria ele como exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Will871 Bueno, o assunto seria ideal no setor de banco de dados, pois aí é questão de modelagem.

 

As normas formais são necessárias para evitar inconsistências.

Então basicamente você pensa primeiro nas entidades que vão ser "esmiúçadas", ou seja, em tabelas separadas.

Vou tentar retratar algo simples, mas dentro do seu contexto.


Primeiro vamos pensar em qual tabela vai controlar os relacionamentos.
chat_usu é nossa tabela.

 

Quem vai participar?

Usuários além de administradores. Então criamos uma tabela membro

 

Com estas duas primeiras tabelas vamos ainda longe, definir uma tabela para o tipo de usuário. se é admin ou normal.
Com isso  teremos mais uma tabela por exemplo tipo_user

 

Temos as nossas 3 principais tabelas. Recapitulando:

  • chat_usu -> armazenará as mensagens, hora postada, quem postou..
  • membro -> armazenará os membros que participarão do chat
  • tipo_user -> armazenará o tipo de usuário que é.

 

Agora vou explicar em detalhes cada tabela:

 

chat_usu -> ID auto increment INT 11 PK, dataHora datetime, ID_usuario INT 11 FK, mensagem Varchar 500(pode ser longtext ou mediumtext se quiser)


membro -> ID auto increment INT 11 PK, ID_tipo_usuario INT 11 FK ,nome varchar 100, email varchar 100, senha varchar 100


tipo_user -> ID auto increment INT 11 PK, tipo_user varchar 50

 

Agora que temos uma estrutura definida, lembre-se de que a tabela chat_usu é a tabela que comanda. Então é nela que você deve criar os índices dos campos de chave estrangeira.

 

No Phpmyadmin, você vai encontrar na aba da estrutura, onde diz " índice"  clicando ali, você nomeia o índice, como por exemplo ID-usuario, seleciona na lista o tipo "INDEX" e por fim, seleciona o campo que será usado no caso o ID_usuario INT 11.

Fazendo isso, sua tabela está pronta para receber um relacionamento via chave estrangeira.

Para fazer o relacionamento 1:N entre a tabela chat_usu e membro use a aba do designer(modo desenho) aí você cria o relacionamento( é intuitivo) depois salva.


Você vai adicionar o índice na tabela membro também, porque é nela que fica a chave estrangeira para o tipo_user.
   
PS: em ambas tabelas ao fazer o relacionamento, se tudo estiver correto, você deverá marcar como "ON cascade" o relacionamento. Pois isso mantém a integridade. Onde se um dado requisito de outro for apagado, o resto relacionado a ele também será apagado ou terá acesso negado ao ser apagado, por conta da dependência.

Depois de feito tudo corretamente,  fazer a consulta seria algo assim:

SELECT membro.nome, tipo_user.tipo_user, chat_user.dataHora, chat_usu.mensagem 
FROM chat_usu
INNER JOIN membro ON membro.ID = chat_usu.ID_usuario
INNER JOIN tipo_user ON tipo_user.ID = membro.ID_tipo_usuario
WHERE tipo_user = [número]

Onde o [número] seria o valor do tipo de usuário 1(admin), 2(membro)

Claro que ali é só um exemplo você pode acrescentar mais cláusulas como order by  

 

Para melhor compreensão, recomendo assistir estes dois vídeos que gravei a um tempo. Embora seja um pouco mais antigo a versão do phpmyadmin,  ainda é 100% funcional(basta achar as opções!)

 

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, vi os dois vídeos, e vou rever meu banco de dados, eu realmente não fiz nada sobre foreing key, eu sempre apliquei isso diretamente no php e ignorei o mysql, pra mandar a real, eu nem sequer sabia dessa aba "designer", sei que foi apresentado para mim em aulas o modelo "entidade e relacionamento", mas faltei nas aulas que aplicaram no phpmyadmin, fez falta!

Vou aplicar isso agora aqui no meu banco, estou apelando pra qualquer coisa que garanta que o desempenho do site seja bom.  haha'

Novamente muuuito obrigado.     ^^

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×