Ir para conteúdo

POWERED BY:

Arquivado

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

Nícolas

MySQL bloqueando Conexões

Recommended Posts

Fala pessoal, seguinte, está acontecendo com frequencia em um site de um de meus clientes o seguinte erro:

Host 'xxx.xxx.xxx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' in ...

 

O site está tendo cerca de 4500 visitas diárias.

 

E vivo tendo que falar com meu amigo, dono do Host para liberar, ele já aumentou o max_connections e tal.

 

Mas volta a acontecer.

 

Este erro é causado por conta de uma má programação do script ou pelo número elevado de visitas que fica abrindo muitas conexões?

 

Eu estou utilizando o mysql_close no fim da página.

 

Mesmo o próprio site do PHP falando que não precisa mais que isso seja feito.

http://br3.php.net/manual/pt_BR/function.mysql-close.php

Usar mysql_close() não é normalmente necessário, já que as conexões não persistentes são automaticamente fechadas ao final da execução do script.

 

Alguém sabe uma possível causa, e o que posso fazer para evitar esse problema novamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha eu tive este mesmo problema, eu implementei o padrão singleton(não sei se você conhece é um padrão de projeto).

 

No php existe uma classe chamada MySQLi(http://www.php.net/manual/pt_BR/class.mysqli.php) que faz acesso ao banco de dados, diferente do modo convencional o MySQLi é uma classe e tem que se instânciada. Quando uma classe do MySQLi é instânciada ela cria uma conexão com o banco de dados.

 

Vou te dar uma pequena explicação de como funciona o singleton.

 

No singleton sempre que o php for instânciar uma classe ele verifica se existe alguma instânicia da mesma, se existir ele não vai fazer uma nova instância da classe, ele vai usar esta classe que já esta instanciada.

 

No php com as funções convêncionais de mysql, se for feito do jeito normal, são feitas várias conexões ao banco de dados, assim o MySQL bloqueia senão ele morre.

 

Usando este padrão quando um usuário vai acessar varias partes do seu site ele não vai fazer várias instâncias da classe MySQLi, como cada instância do mysqli corresponde a uma conexão então o usuário vai fazer uma só conexão pelo tempo que ele estiver pelo site.

 

Vou passar aki um exemplo de singleton usando a classe mysqli que está na wikipedia.

 

Um detalhe é que no singleton você não deve fechar a conexão, porque afinal de contas o usuário vai precisar reutilizar a conexão =), assim a conexão irá fechar por timeout(o bom é verificar qual é o timeout que está configurado no servidor).

 

Segue o código:

 

<?php
class Singleton
{
private static $_instance;

       // Evita que a classe seja instanciada publicamente
       private function __construct() { }

// Evita que a classe seja clonada
       private function __clone() { }

public static function getInstance()
{
	if (!isset(self::$_instance)) { // Testa se há instância definifa na propriedade, caso sim, a classe não será instanciada novamente.
		self::$_instance = new mysqli("host","user","pass","database"); // o new self cria uma instância da própria classe à própria classe.
	}
	return self::$_instance;
}
}
?>

 

 

Um exemplo de uso:

 

<?php

include_once("singleton.php");
$conexao = Singleton::singleton();

$resultado = $conexao->query("MINHA QUERY");

$row = $resultado->fetch_row();

print_r($row);

?>

 

espero ter ajudado, e espero que o problema seja esse, pois para mim funcionou, eu precisava fazer um acesso ao banco de dados a cada 3 segundos, se não fosse o singleton o meu mysql iria cair toda hora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poo Ablank, vlw pela força cara, mas o ruim é que é um sistema de compra coletiva que desenvolvi e já está todo programado, não vale apena readaptar todo o sistema para o singleton.

 

Por essa idéia que você havia dito, o conceito do pconnect não é parecido?

http://www.php.net/manual/pt_BR/function.mysql-pconnect.php

 

Só que nunca usei, alguém sabe uma vantagem além dessa?

 

Sei que vi que tem uns pontos negativos que tem grande chance de sobrecarga no servidor no caso de algum loop infinito, mas faz tempo.

 

Alguém já usou ou sabe se isso ajudaria?

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.