Datenbankverbindungen
Der MySQL-Server unterstützt die Verwendung verschiedener
Transportschichten für Verbindungen. Verbindungen verwenden TCP/IP,
Unix-Domain-Sockets oder Windows Named Pipes.
Der Hostname localhost
hat eine besondere Bedeutung. Er
ist an die Verwendung von Unix-Domain-Sockets gebunden. Um eine
TCP/IP-Verbindung zum Localhost zu öffnen, muss 127.0.0.1
anstelle des Hostnamens localhost
verwendet werden.
Beispiel #1 Die besondere Bedeutung von localhost
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
echo $mysqli->host_info . "\n";
$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
echo $mysqli->host_info . "\n";
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Localhost via UNIX socket
127.0.0.1 via TCP/IP
Standardwerte für Verbindungsparameter
Je nach verwendeter Verbindungsfunktion können verschiedene Parameter
weggelassen werden. Wenn ein Parameter nicht angegeben wird, versucht die
Erweiterung, die Standardwerte zu verwenden, die in der
PHP-Konfigurationsdatei festgelegt sind.
Beispiel #2 Standardwerte festlegen
mysqli.default_host=192.168.2.27
mysqli.default_user=root
mysqli.default_pw=""
mysqli.default_port=3306
mysqli.default_socket=/tmp/mysql.sock
Die entsprechenden Parameterwerte werden dann an die Client-Bibliothek
übergeben, die von der Erweiterung verwendet wird. Wenn die
Client-Bibliothek leere oder nicht gesetzte Parameter findet, kann sie die
Standardwerte der Bibliothek verwenden.
Standardwerte der integrierten Verbindungsbibliothek
Wenn der Wert von host nicht definiert oder leer ist, verwendet die
Client-Bibliothek standardmäßig eine Unix-Socket-Verbindung zu
localhost
. Wenn der Socket undefiniert oder leer ist und
eine Unix-Socket-Verbindung angefordert wird, dann wird versucht, eine
Verbindung zum Standardsocket /tmp/mysql.sock
aufzubauen.
Auf Windows-Systemen wird der Hostname .
von der
Client-Bibliothek als Versuch interpretiert, eine auf einer Windows Namend
Pipe basierende Verbindung zu öffnen. In diesem Fall wird der
Socket-Parameter als Name der Pipe interpretiert. Wird er nicht angegeben
oder ist er leer, dann wird der Socket (Name der Pipe) standardmäßig auf
\\.\pipe\MySQL
gesetzt.
Wenn eine Verbindung weder basierend auf einen Unix-Domänen-Socket noch auf
eine Windows Named Pipe aufgebaut werden soll und der Parameterwert für den
Port nicht gesetzt ist, verwendet die Bibliothek standardmäßig den Port
3306
.
Die mysqlnd-Bibliothek und die
MySQL-Client-Bibliothek (libmysqlclient) implementieren dieselbe Logik zur
Bestimmung der Standardwerte.
Optionen für die Verbindung
Die Verbindungsoptionen sind verfügbar, um z. B. Initialisierungsbefehle zu
setzen, die beim Aufbau der Verbindung ausgeführt werden, oder um die
Verwendung eines bestimmten Zeichensatzes anzugeben. Die
Verbindungsoptionen müssen gesetzt werden, bevor eine Netzwerkverbindung
aufgebaut wird.
Um eine Verbindungsoption zu setzen, muss der Verbindungsvorgang in drei
Schritten durchgeführt werden: erstellen eines Verbindungs-Handles mit
mysqli_init() oder
mysqli::__construct(), setzen der gewünschten
Optionen mit mysqli::options() und Aufbau der
Netzwerkverbindung mit mysqli::real_connect().
Pooling von Verbindungen
Die mysqli-Erweiterung unterstützt persistente Datenbankverbindungen, die
eine spezielle Art von gepoolten Verbindungen sind. Standardmäßig wird jede
Datenbankverbindung, die von einem Skript geöffnet wird, entweder explizit
durch den Benutzer während der Laufzeit geschlossen oder am Ende des
Skripts automatisch freigegeben. Eine persistente Verbindung wird nicht
geschlossen. Stattdessen wird sie in einen Pool gelegt, um später
wiederverwendet zu werden, wenn eine Verbindung zum selben Server mit
denselben Benutzernamen, Passwort, Socket, Port und Standarddatenbank
geöffnet wird. Die Wiederverwendung spart Verbindungs-Overhead.
Jeder PHP-Prozess verwendet seinen eigenen mysqli-Verbindungspool. Abhängig
vom Einsatzmodell des Webservers kann ein PHP-Prozess eine oder mehrere
Anfragen bedienen. Daher kann eine in einem Pool gehaltene Verbindung von
einem oder mehreren Skripten nacheinander verwendet werden.
Persistente Verbindung
Wenn im Verbindungspool für eine bestimmte Kombination von Host,
Benutzername, Passwort, Socket, Port und Standarddatenbank keine unbenutzte
persistente Verbindung gefunden wird, öffnet mysqli eine neue Verbindung.
Die Verwendung persistenter Verbindungen kann mit der PHP-Direktive
mysqli.allow_persistent
aktiviert und deaktiviert werden. Die Gesamtzahl der von einem Skript
geöffneten Verbindungen kann mit
mysqli.max_links begrenzt
werden. Die maximale Anzahl von persistenten Verbindungen pro PHP-Prozess
kann mit
mysqli.max_persistent
begrenzt werden. Bitte beachten Sie, dass der Webserver viele PHP-Prozesse
erzeugen kann.
Eine häufige Kritik an persistenten Verbindungen ist, dass ihr Zustand vor
der Wiederverwendung nicht zurückgesetzt wird. Zum Beispiel werden offene
und nicht abgeschlossene Transaktionen nicht nicht automatisch
zurückgesetzt. Aber auch Berechtigungsänderungen, die in der Zeit zwischen
der Aufnahme der Verbindung in den Pool und ihrer Wiederverwendung
vorgenommen wurden, werden nicht berücksichtigt. Dies kann als
unerwünschter Nebeneffekt angesehen werden. Andererseits kann der Name
persistent
als Zusage verstanden werden, dass der
Zustand erhalten bleibt.
Die mysqli-Erweiterung unterstützt beide Arten einer persistenten
Verbindung: den persistenten Zustand und den vor der Wiederverwendung
zurückgesetzten Zustand. Die Voreinstellung ist Zurücksetzen. Bevor eine
persistente Verbindung wiederverwendet wird, ruft die mysqli-Erweiterung
implizit mysqli::change_user() auf, um den Zustand
zurückzusetzen. Die persistente Verbindung erscheint dem Benutzer so, als
ob sie gerade geöffnet worden wäre. Es sind keine Spuren von früheren
Verwendungen sichtbar.
Der Aufruf von mysqli::change_user() ist eine
aufwändige Operation. Um die beste Leistung zu erzielen, sollten Benutzer
die Erweiterung mit dem Kompilierungsflag
MYSQLI_NO_CHANGE_USER_ON_PCONNECT
neu kompilieren.
Es ist dem Benutzer überlassen, zwischen sicherem Verhalten und bester
Leistung zu wählen. Beides sind berechtigte Optimierungsziele. Um die
Benutzung zu erleichtern, wurde das sichere Verhalten auf Kosten der
maximalen Leistung als Standard festgelegt.
Siehe auch