Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Padrão de conexão de banco de dados PHP singleton


Usando singletons em PHP é considerado má prática. Pela minha experiência, o problema mais problemático com eles são os testes de unidade. É difícil garantir que dois testes sejam independentes ao testar singletons.

Eu delegaria a responsabilidade pela restrição "somente uma instância deveria existir" ao código que cria o objeto Db.

Também para mim, parece que há um mal-entendido em como os Singletons funcionam em PHP em contraste com outras linguagens:Se você tiver 10.000 solicitações simultâneas, por exemplo, cada solicitação será executada em um processo ou thread PHP separado, o que significa que todos terão seus próprios instância do "singleton", não há compartilhamento deste objeto para mais de uma única solicitação (ao executar PHP em cenários comuns de back-end da web)

Não há "pooling de conexões" em PHP, mas você pode usar mysqli conexões persistentes para mysql. Isso pode ser alcançado passando o p: na frente do nome do host ao criar mysqli. Isso pode ajudar aqui, mas trate com cuidado (o que significa que leia a documentação primeiro )

No entanto, apenas para teoria, um singleton em PHP deve estar ciente do fato de que alguém pode usar clone . Ou seja, no seu caso, seria possível fazer isso:
$db = DB::getInstance();
$db2 = clone $db; 

Para evitar isso, você pode implementar o __clone() método assim:
public function __clone() {
    throw new Exception("Can't clone a singleton");
}