Mysql
 sql >> Base de données >  >> RDS >> Mysql

Modèle de connexion à la base de données singleton PHP

Utilisation de singletons en PHP est considéré comme une mauvaise pratique. D'après mon expérience, le problème le plus problématique avec eux sont les tests unitaires. Il est difficile de s'assurer que deux tests sont indépendants lors du test de singletons.

Je déléguerais la responsabilité de la contrainte "une seule instance devrait exister" au code qui crée l'objet Db.

De plus, pour moi, il semble qu'il y ait un malentendu sur le fonctionnement des singletons en PHP, contrairement aux autres langages :si vous avez 10 000 requêtes simultanées, par exemple, chaque requête s'exécute dans un processus ou un thread PHP distinct, ce qui signifie qu'elles auront toutes la leur. instance du "singleton", il n'y a pas de partage de cet objet pour plus d'une seule requête (lors de l'exécution de PHP dans des scénarios de backend Web courants)

Il n'y a pas de "regroupement de connexions" en PHP, mais vous pouvez utiliser mysqli connexions persistantes pour mysql. Cela peut être réalisé en passant le p: devant le nom d'hôte lors de la création de mysqli. Cela peut aider ici, mais manipulez-le avec précaution (ce qui signifie lire d'abord la documentation )

Cependant, juste pour la théorie, un singleton en PHP doit être conscient du fait que quelqu'un pourrait utiliser clone . Cela signifie que dans votre cas, il serait possible de le faire :

$db = DB::getInstance();
$db2 = clone $db; 

Pour éviter cela, vous pouvez implémenter le __clone() méthode comme celle-ci :

public function __clone() {
    throw new Exception("Can't clone a singleton");
}