PHP singleton-Datenbank-Verbindung-Muster
Ich arbeite an einem kleinen Projekt mit PHP und MySQL. Ich habe viel gelesen, um sich über best practices zum verwalten einer Verbindung und so weiter.
Habe ich auch implementiert (im folgenden werden einige Beiträge gefunden um) eine singleton-Klasse zur Verwaltung von MySQL-verbindungen.
require_once 'config.inc.php';
class DbConn {
private static $instance;
private $dbConn;
private function __construct() {}
/**
*
* @return DbConn
*/
private static function getInstance(){
if (self::$instance == null){
$className = __CLASS__;
self::$instance = new $className;
}
return self::$instance;
}
/**
*
* @return DbConn
*/
private static function initConnection(){
$db = self::getInstance();
$connConf = getConfigData();
$db->dbConn = new mysqli($connConf['db_host'], $connConf['db_user'], $connConf['db_pwd'],$connConf['db_name']);
$db->dbConn->set_charset('utf8');
return $db;
}
/**
* @return mysqli
*/
public static function getDbConn() {
try {
$db = self::initConnection();
return $db->dbConn;
} catch (Exception $ex) {
echo "I was unable to open a connection to the database. " . $ex->getMessage();
return null;
}
}
}
Aber... Wenn meine Webseite hat wie 10K Besucher gleichzeitig und ich rufe jedes mal, wenn mein singleton-Objekt, sollte ich erwarten, dass performance-Probleme? Ich meinte, sollte ich nicht eine Art pool von verbindungen anstatt eines singleton?
Und was ist der Widerspruch? Können Sie einfach richten Sie die Anschlüsse ein, beharrlich zu sein und verwenden Sie ein singleton. Dieses Modell wird verwendet, so dass eine einzelne Anfrage nicht schließen, zweimal, um die Datenbank, sondern zwei verschiedene clients führen zwei verschiedene Instanzen der Skript, so wird die Verwendung von zwei verschiedenen verbindungen
Sicher. Wie dumm ich bin. Danke!
Danke für die Erklärung. Viele von uns gar nicht darüber nachdenken.
Sicher. Wie dumm ich bin. Danke!
Danke für die Erklärung. Viele von uns gar nicht darüber nachdenken.
InformationsquelleAutor LucasM | 2014-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
singletons
in PHP wird als schlechte Praxis. Aus meiner Erfahrung die meisten Problem sind unit-tests. Es ist hart, um sicherzustellen, dass zwei tests unabhängig sind, wenn die Prüfung singletons.Ich würde delegieren die Verantwortung für die Einschränkung "nur eine Instanz vorhanden ist", um den code, der erstellt das Db-Objekt.
Auch für mich sieht es aus wie Sie nicht verstehen, wie Singletons arbeiten in PHP im Gegensatz zu anderen Sprachen. Wenn Sie 10.000 gleichzeitigen Anfragen beispielsweise dann jede Anforderung wird in einem separaten PHP-Prozess oder thread, das heißt, Sie alle haben Ihre eigene Instanz der "singleton".
Gibt es keine "connection pooling" in PHP, aber Sie können
mysqli
persistente verbindungen für mysql. Es kann erreicht werden, indem diep:
vor der hostname beim erstellen einer MySQL-Datenbank. Dies könnte hier helfen, aber behandeln Sie es mit Sorgfalt (Bedeutung Lesen Sie in der Dokumentation erste)Jedoch nur für die Theorie, ein singleton in PHP müssen sich der Tatsache bewusst sein, dass jemand zu verwenden
clone
. Was bedeutet in Ihrem Fall wäre es möglich, dies zu tun:Zu vermeiden, dass Sie implementieren können, die
__clone()
Methode wie diese:Dies ist nicht im Zusammenhang. Würde ich nur tun
$db = new Db()
und dann stellen Sie sicher, dass diese Instanz ist zugänglich von allen Ebenen der code, die Sie benötigen. Symfony2 ist mit IhrenService
Konzept. IMO macht das Sinn und ist eine gute design-Ansatz.. (hätte Nie gedacht, dass es kommen wird der Tag, wenn ich sage, dass dies über symfony 🙂 Aber ich habe, und denke, das ist eine nette Umsetzung) ... Check this: symfony.com/doc/current/book/service_container.htmlEs habe! Nochmals vielen Dank. Cheers
In der Regel die Vermeidung von Singletons im Interesse der Vermeidung von singletons ist schlecht angesehen, Praxis als gut. Es gibt eine richtige Zeit und Ort für jede Art von Muster, nur nicht über-oder-Unterschreitungen.
InformationsquelleAutor hek2mgl