sql >> Database >  >> RDS >> Mysql

PHP singleton database verbindingspatroon

singletons gebruiken in PHP wordt als een slechte gewoonte beschouwd. Vanuit mijn ervaring zijn unit-tests het meest problematische probleem met hen. Het is moeilijk om ervoor te zorgen dat twee tests onafhankelijk zijn bij het testen van eenlingen.

Ik zou de verantwoordelijkheid voor de beperking "er mag slechts één instantie bestaan" delegeren aan de code die het Db-object maakt.

Ook voor mij lijkt het erop dat er een misverstand bestaat over hoe Singletons in PHP werken in tegenstelling tot andere talen:als je bijvoorbeeld 10.000 gelijktijdige verzoeken hebt, dan wordt elk verzoek uitgevoerd in een afzonderlijk PHP-proces of -thread, wat betekent dat ze allemaal hun eigen instantie van de "singleton", wordt dit object niet gedeeld voor meer dan een enkel verzoek (wanneer PHP wordt uitgevoerd in algemene webbackend-scenario's)

Er is geen "connection pooling" in PHP, maar u kunt mysqli . gebruiken aanhoudende verbindingen voor mysql. Dit kan worden bereikt door de p: . door te geven voor de hostnaam bij het maken van mysqli. Dit kan hier helpen, maar ga er voorzichtig mee om (wat betekent dat je eerst de documentatie moet lezen )

Echter, alleen voor de theorie, een singleton in PHP moet zich bewust zijn van het feit dat iemand clone zou kunnen gebruiken . Dit betekent dat het in jouw geval mogelijk zou zijn om dat te doen:

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

Om dat te voorkomen kun je de __clone() . implementeren methode als volgt:

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



  1. MySQL gebruiken met Oracle Heterogene Services

  2. Tips voor het bewaken van MariaDB-cluster

  3. Batch-inserts met PHP

  4. MySQL cumulatieve som gegroepeerd op datum