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