Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP-Singleton-Datenbank-Verbindungsmuster

Verwendung von singletons in PHP gilt als schlechte Praxis. Aus meiner Erfahrung sind Unit-Tests das problematischste Problem mit ihnen. Es ist schwierig sicherzustellen, dass zwei Tests beim Testen von Singletons unabhängig sind.

Ich würde die Verantwortung für die Einschränkung "nur eine Instanz sollte existieren" an den Code delegieren, der das Db-Objekt erstellt.

Auch scheint es für mich ein Missverständnis zu geben, wie Singletons in PHP im Gegensatz zu anderen Sprachen funktionieren:Wenn Sie beispielsweise 10.000 gleichzeitige Anfragen haben, dann läuft jede Anfrage in einem separaten PHP-Prozess oder -Thread, was bedeutet, dass sie alle ihren eigenen haben Instanz von „singleton“, gibt es keine gemeinsame Nutzung dieses Objekts für mehr als eine einzelne Anfrage (wenn PHP in gängigen Web-Backend-Szenarien ausgeführt wird)

Es gibt kein "Verbindungspooling" in PHP, aber Sie können mysqli verwenden dauerhafte Verbindungen für mysql. Dies kann erreicht werden, indem der p: übergeben wird vor dem Hostnamen beim Erstellen von mysqli. Dies könnte hier helfen, aber gehen Sie vorsichtig damit um (was bedeutet, dass Sie zuerst die Dokumentation lesen )

Aber nur für die Theorie, ein Singleton in PHP muss sich der Tatsache bewusst sein, dass jemand clone verwenden könnte . Das heißt, in Ihrem Fall wäre dies möglich:

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

Um dies zu vermeiden, können Sie den __clone() implementieren Methode wie folgt:

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