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

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

PHP cURL-Tutorial: Verwendung von cURL zum Durchführen von HTTP-Anfragen

cURL ist eine leistungsstarke PHP-Erweiterung, die es Ihnen ermöglicht, mit verschiedenen Servern über verschiedene Protokolle wie HTTP, HTTPS, FTP und mehr zu kommunizieren. ...

TheMax

Autor : TheMax
Kategorie: PHP-Tutorials

Midjourney Tutorial - Anleitung für Anfänger

Über Midjourney, dem Tool zur Erstellung digitaler Bilder mithilfe von künstlicher Intelligenz, gibt es ein informatives Video mit dem Titel "Midjourney Tutorial auf Deutsch - Anleitung für Anfänger" ...

Mike94

Autor : Mike94
Kategorie: KI Tutorials

Grundlagen von Views in MySQL

Views in einer MySQL-Datenbank bieten die Möglichkeit, eine virtuelle Tabelle basierend auf dem Ergebnis einer SQL-Abfrage zu erstellen. ...

admin

Autor : admin
Kategorie: mySQL-Tutorials

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

Daten einer Abfrage mit Hilfe von Thumbnails nebeneinander ausgeben

Warum soll ich float meiden? Siehe https://www.linkedin.com/pulse/css-float-vs-grid-flexbox-sachin-tiwari Falls es mit Englisch nicht so klappt: ...

Geschrieben von scatello am 18.05.2024 05:57:56
Forum: PHP Developer Forum
Daten einer Abfrage mit Hilfe von Thumbnails nebeneinander ausgeben

Also den Fehler habe ich gefunden und abgestellt. Warum soll ich float meiden?

Geschrieben von Malchor am 17.05.2024 20:54:01
Forum: PHP Developer Forum
Daten einer Abfrage mit Hilfe von Thumbnails nebeneinander ausgeben

Dein HTML-Code ist definitiv kaputt und float solltest du auch vergessen. Beschäftige dich mit Flex-Box oder Grid

Geschrieben von scatello am 17.05.2024 20:43:50
Forum: PHP Developer Forum
Daten einer Abfrage mit Hilfe von Thumbnails nebeneinander ausgeben

Da ich viele unterschiedliche Tabellen benötige mache ich das so umständlich. Aber ist das der Grund warum das Floaten nicht funktioniert?

Geschrieben von Malchor am 17.05.2024 17:15:03
Forum: PHP Developer Forum