aline_ 4 Denunciar post Postado Julho 25, 2012 Bom dia! Não sei se o tópico é mysql ou php, mas vou tentar aqui. Alguém pode me ajudar a entender conexões? Até hoje eu usei um arquivo de conexão com: $Conexao= mysqli_connect($hostname, $username, $password, $database) or trigger_error(mysqli_connect_error()); Uso esse arquivo em todas as páginas que fazem acesso ao banco. São mais de 40. require_once('Connections/Conexao.php'); Ontem coloquei o sistema no ar, e fiz vários testes. No final da manhã aconteceu o erro "Too many connections". O limite do banco é 100. Nunca tinha parado para pensar sobre as conexões, agora estou perdida. O que aconteceu? Cada vez que eu chamo o Conexao.php é aberta uma conexão, eu abri mais de 100 programas e estourou? O script não deveria fechar automaticamente? O correto é fechar as conexões? Mas onde? Quando o usuário sair do programa? Eu não corro o risco de fechar uma conexão que está sendo usada em outra aba, caso ele tenha mais de uma aberta? E se ele não sair? Se me disserem pra por no fim do script, peço que expliquem o que isso significa. Já li em vários lugares, mas não entendo, eu não sei onde é o fim. Em um mesmo programa o usuário pode fazer 1 ou 50 acessos ao banco. Eu quero evitar que esse erro ocorra novamente. Se eu sozinha testando o sistema consegui provocar o erro em menos de 4 horas, imagina quando todos estiverem usando. Alguém pode "desenhar" como isso funciona? Muito obrigada! Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Julho 25, 2012 Olá Aline... Bem, há vários aspectos a serem entendidos. Existem 2 tipos de conexões com o banco de dados, conexões normais e conexões persistentes. No seu caso parece que estão sendo utilizadas conexões normais, onde cada nova página abre uma nova conexão com o banco de dados, isto é um comportamento normal, o que deveria esta ocorrendo é um gerenciamento dessas conexões, se você abre sempre uma conexão no inicio do script, feche no final. Sim, as conexões que estão inativas são fechadas automaticamente, mas isto não acontece imediatamente após a execução do script. E como as conexões persistentes funcionam? Essas conexões fazem um reaproveitamento das conexões inativas. São melhores que as conexões normais? Não necessariamente, isto depende do projeto. Se você abre muitas conexões, provavelmente conexões persistentes serão melhores. Leia mais em: http://br2.php.net/manual/pt_BR/features.persistent-connections.php Como identificar o "fim do script"? Bem, isto varia projeto para projeto, se o seu projeto for orientado a objetos, trabalhe da seguinte maneira: abriu, usou fechou. Se o seu projeto é baseado em includes, feche a conexão no include do rodapé. Se estiver usando AJAX e em cada script você abrir uma conexão, feche no mesmo script. Conexões persistentes não precisam ser fechadas. Compartilhar este post Link para o post Compartilhar em outros sites
aline_ 4 Denunciar post Postado Julho 25, 2012 Obrigada Prog!! Muito boa explicação. Sobre conexões persistentes, fiquei com receio de usar. Impacta nas transações, tabelas presas... Mas se precisar, vou ler mais sobre. Quanto as normais, entendi onde devo fechar, mas e em um caso como esse: Tenho um programa aberto onde posso incluir, excluir, e alterar clientes. Posso abrir em uma nova aba outro programa que inclui, exclui, e altera pedidos. Os dois usam o mesmo arquivo de conexão, estão dentro da mesma sessão, sendo executados ao mesmo tempo, pelo mesmo usuário. Se eu colocar o close no fim de cada script, não posso acabar fechando uma conexão que está em uso na outra aba? Ex: Aba 1 - 14:00:01 abre programa - 14:00:10 inclui registro - fecha conexão 14:00:11 Aba 2 - 14:00:05 abre programa e faz uma consulta que leva 10 segundos, iria até 14:00:15, mas aos :11 foi fechada a (última?) conexão. Isso faz sentido? Ocorria algum problema? Outra dúvida, se houverem dois usuários, um não influencia na conexão do outro, certo? :blush: Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Julho 25, 2012 Aline, entendo sua preocupação, mas a resposta é não... vou tentar explicar um pouco mais sobre o assunto. Estamos falando de programas Web em PHP, certo? Programas web seguem todas as regras do protocolo de comunicação HTTP, por definição este protocolo é stateless, e por este mesmo motivo, uma conexão numa página web não irá interferir na conexão de uma outra página, mesmo que na mesma sessão. Cada requisição é independente. Se você abre uma conexão numa página, ela será unicamente desta página, você fechando ou não. Lembra que você questionou sobre o fechamento da conexão ao final do script? Sim, isto é verdade, mas cada script roda independente do outro, cada um com sua "própria" conexão. Sendo assim, o close de cada página vai fechar apenas a conexão aberta pela mesma página. Executados pelos mesmo navegador, abas diferentes, mesma página executada N vezes, pelo mesmo usuário ou usuário diferente, na mesma sessão ou não... não importa, são conexões independentes. Então... feche as conexões sem medo de ser feliz! ;) Compartilhar este post Link para o post Compartilhar em outros sites
aline_ 4 Denunciar post Postado Julho 26, 2012 Perfeito, agora posso dormir tranquila rsrsrs. Valeu! Compartilhar este post Link para o post Compartilhar em outros sites