sql >> Database teknologi >  >> RDS >> Mysql

PHP singleton database forbindelsesmønster

Brug af singletons i PHP betragtes som dårlig praksis. Fra min erfaring er det mest problematiske problem med dem enhedstest. Det er svært at sikre, at to tests er uafhængige, når man tester singletons.

Jeg ville uddelegere ansvaret for begrænsningen "kun én forekomst bør eksistere" til den kode, der opretter Db-objektet.

Også for mig ser det ud til, at der er en misforståelse i, hvordan singletons fungerer i PHP i modsætning til andre sprog:Hvis du for eksempel har 10.000 samtidige anmodninger, så kører hver anmodning i en separat PHP-proces eller -tråd, hvilket betyder, at de alle vil have deres egen forekomst af "singleton", er der ingen deling af dette objekt for mere end en enkelt anmodning (når PHP køres i almindelige web-backend-scenarier)

Der er ingen "connection pooling" i PHP, men du kan bruge mysqli vedvarende forbindelser til mysql. Det kan opnås ved at sende p: foran værtsnavnet, når du opretter mysqli. Dette kan måske hjælpe her, men håndtér det med omhu (dvs. læs dokumentationen først )

Men bare for teorien, skal en singleton i PHP være opmærksom på det faktum, at nogen kunne bruge clone . Det betyder i dit tilfælde, at det ville være muligt at gøre det:

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

For at undgå det kan du implementere __clone() metode som denne:

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



  1. Mysql-array virker ikke

  2. Konvertering af mysql TIME fra 24 HR til AM/PM format

  3. Hvad er en tidsseriedatabase?

  4. Sådan opretter du en databasedrevet navigationsmenu på flere niveauer ved hjælp af Laravel