asynchrone Abfrage abfragen
Einführung
MySQLi ist eine beliebte PHP-Erweiterung, die es Entwicklern ermöglicht, eine Verbindung zu MySQL-Datenbanken herzustellen und verschiedene Operationen durchzuführen. MySQLi unterstützt das nicht-blockierende Starten von Abfragen, wodurch Entwickler eine Abfrage senden und mit der Ausführung anderen Codes fortfahren können, ohne auf das Ergebnis zu warten. Die Ergebnisse werden in einem Puffer gespeichert und können später mit mysqli_reap_async_query() abgerufen werden.
In diesem umfassenden Leitfaden erklären wir, wie MySQLi-Nichtblockierungsabfragen funktionieren, wie sie implementiert werden, und bieten Beispiele sowie Anwendungsfälle.
Was ist die nicht-blockierende Abfrageausführung in MySQLi?
mysqli_reap_async_query() ist eine PHP-Funktion, die den Ergebnissatz einer mit mysqli_send_query() gestarteten Abfrage abruft. Sie führt die Abfrage nicht selbst aus; stattdessen wird das Ergebnis abgerufen, nachdem die Abfrage gesendet wurde. Diese Funktion ist für nicht-blockierende Datenbankoperationen in PHP unerlässlich. Beachten Sie, dass mysqli_store_result() blockiert, bis alle Ergebnisse verfügbar sind, und sollte nicht in asynchronen Workflows verwendet werden.
So funktionieren MySQLi-Nichtblockierungsabfragen
MySQLi-Nichtblockierungsabfragen funktionieren, indem sie das Starten der Abfrage von der Ergebnissabrufung trennen. Zuerst sendet mysqli_send_query() die Abfrage an den MySQL-Server und kehrt sofort zurück. Der Server verarbeitet die Abfrage im Hintergrund. Sobald sie bereit ist, ruft mysqli_reap_async_query() den Ergebnissatz aus dem Verbindungs-Puffer ab.
Hinweis: Während mysqli_send_query() nicht-blockierend ist, wird das Abrufen von Ergebnissen mit mysqli_reap_async_query() blockieren, wenn die Ergebnisse noch nicht verfügbar sind. Eine echte asynchrone Ausführung in PHP erfordert in der Regel externe Bibliotheken oder Event-Loops.
Hier ist ein Beispiel für die Verwendung von MySQLi-Nichtblockierungsabfragen:
<?php
// Create a connection to the MySQL server
$conn = mysqli_connect("localhost", "username", "password", "database");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// Create a query
$query = "SELECT * FROM table";
// Initiate the query asynchronously
if (!mysqli_send_query($conn, $query)) {
die("Query failed: " . mysqli_error($conn));
}
// Execute other code here without blocking
// Fetch the result when ready
$result = mysqli_reap_async_query($conn);
if ($result) {
// Process $result
} else {
// Results not ready yet or an error occurred
echo "Result not ready: " . mysqli_error($conn);
}
?>In diesem Beispiel wird die Abfrage asynchron mit mysqli_send_query() gestartet. Das Skript setzt die Ausführung fort, und mysqli_reap_async_query() wird später aufgerufen, um die gespeicherten Ergebnisse abzurufen.
So verwenden Sie MySQLi-Nichtblockierungsabfragen
Um MySQLi-Nichtblockierungsabfragen zu verwenden, gehen Sie wie folgt vor:
- Stellen Sie eine Verbindung zum MySQL-Server mit
mysqli_connect()her. - Starten Sie die Abfrage asynchron mit
mysqli_send_query(). - Führen Sie andere Aufgaben aus, während die Abfrage im Hintergrund läuft.
- Rufen Sie den Ergebnissatz mit
mysqli_reap_async_query()ab. - Verarbeiten Sie das zurückgegebene
mysqli_result-Objekt.
Hinweis: mysqli_poll() ist eine separate Funktion, die zum Überprüfen des Status mehrerer Verbindungen verwendet wird. Sie erwartet ein Array von Verbindungen und gibt die Anzahl der bereiten Verbindungen zurück, nicht die Abfrageergebnisse selbst.
Anwendungsfälle für MySQLi-Nichtblockierungsabfragen
MySQLi-Nichtblockierungsabfragen sind nützlich für PHP-Entwickler, die mehrere Abfragen parallel ausführen oder langlaufende Abfragen durchführen möchten, ohne andere Codeausführungen zu blockieren. Hier sind einige praktische Anwendungsfälle für diesen Ansatz:
1. Parallele Abfrageausführung
Entwickler können MySQLi-Nichtblockierungsabfragen verwenden, um mehrere unabhängige Abfragen parallel auszuführen. Durch das Senden jeder Abfrage mit mysqli_send_query() und das Verschachteln anderer Logik können Anwendungen die Gesamtwartezeiten beim Abrufen von Daten aus mehreren Tabellen oder Diensten reduzieren.
2. Langlaufende Abfragen
Langlaufende Abfragen können asynchron gestartet werden, sodass das PHP-Skript andere Aufgaben erledigen kann, wie z. B. Protokollierung, Benutzeroberflächen-Updates oder die Verarbeitung von Benutzereingaben, während die Datenbank die Operation abschließt.
3. Echtzeitanwendungen
Anwendungen, die häufiges Daten-Polling oder Echtzeit-Updates erfordern, können Abfragen starten, ohne den Hauptausführungsthread zu einfrieren. Dies ist besonders nützlich für CLI-basierte Überwachungstools oder leichte Web-Endpunkte, die schnell antworten müssen.
4. Asynchrone Datenverarbeitung
Entwickler können schwere Datenabrufaufgaben in den Hintergrund auslagern, während das Hauptskript andere Datenströme verarbeitet, was den Gesamtdurchsatz bei Batch-Verarbeitungen oder ETL-Workflows verbessert.
Vorteile von MySQLi-Nichtblockierungsabfragen
MySQLi-Nichtblockierungsabfragen bieten PHP-Entwicklern mehrere Vorteile:
1. Verbesserte Leistung
Durch die asynchrone Ausführung von Abfragen wird die Ausführung anderen Codes nicht blockiert, was zu einer schnelleren Anwendungsleistung führt. Dies ist besonders vorteilhaft für Anwendungen, die Daten aus mehreren Quellen aggregieren oder hohe Parallelitätsanfragen verarbeiten.
2. Bessere Ressourcennutzung
Die nicht-blockierende Ausführung ermöglicht es dem PHP-Prozess, während des Wartens auf Datenbankoperationen reaktionsfähig zu bleiben, was Leerlaufzeiten reduziert und die Server-Ressourcennutzung verbessert.
3. Vereinfachtes Hintergrundaufgabmanagement
Entwickler können mehrere Datenbankoperationen verketten, ohne Callbacks zu verschachteln oder komplexe Zustandsmaschinen zu verwenden, was den Code für Standard-Prozedural-PHP-Skripte leichter lesbar und wartbar macht.
Fazit
MySQLi-Nichtblockierungsabfragen sind ein leistungsstarker Ansatz für PHP-Entwickler, die Abfragen mit MySQLi starten möchten, ohne auf sofortige Ergebnisse warten zu müssen. Sie ermöglicht es Entwicklern, Abfragen im Hintergrund zu senden und mit der Ausführung anderen Codes fortzufahren. Die Ergebnisse der Abfrage werden in einem Puffer gespeichert, der später mit mysqli_reap_async_query() abgerufen werden kann, wenn der Entwickler bereit ist, sie zu verarbeiten. Dieser Ansatz kann die Leistung von PHP-Anwendungen, die mehrere Abfragen gleichzeitig ausführen oder langlaufende Abfragen durchführen müssen, erheblich verbessern. Entwickler können diesen Ansatz auch zur Entwicklung von Echtzeit-PHP-Anwendungen oder für asynchrone Datenverarbeitungsaufgaben nutzen. Mit seinen zahlreichen Vorteilen ist die nicht-blockierende Abfrageausführung in MySQLi ein wertvolles Werkzeug für PHP-Entwickler.
Praxis
Was ist korrekt bezüglich der Ausführung einer MySQL-Abfrage in PHP mit der Methode reap_async_query?