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

Modello di connessione al database singleton PHP

Utilizzo di singletons in PHP è considerata una cattiva pratica. Dalla mia esperienza, il problema più problematico con loro sono i test unitari. È difficile garantire che due test siano indipendenti quando si testano i singleton.

Delegherei la responsabilità del vincolo "dovrebbe esistere solo un'istanza" al codice che crea l'oggetto Db.

Anche per me sembra che ci sia un malinteso nel modo in cui Singletons funziona in PHP in contrasto con altri linguaggi:se hai 10.000 richieste simultanee, ad esempio, ogni richiesta viene eseguita in un processo o thread PHP separato, il che significa che avranno tutti il ​​proprio istanza del "singleton", non c'è condivisione di questo oggetto per più di una singola richiesta (quando si esegue PHP in scenari di backend web comuni)

Non esiste un "pooling di connessioni" in PHP, ma puoi usare mysqli connessioni persistenti per MySQL. Può essere ottenuto passando il p: davanti al nome host durante la creazione di mysqli. Questo potrebbe essere d'aiuto in questo caso, ma gestiscilo con cura (significa prima leggere la documentazione )

Tuttavia, solo per teoria, un singleton in PHP deve essere consapevole del fatto che qualcuno potrebbe usare clone . Significa che nel tuo caso sarebbe possibile farlo:

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

Per evitarlo puoi implementare il __clone() metodo come questo:

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