Heim > Artikel > Backend-Entwicklung > PHP implementiert echtes asynchrones MySQL
Sprachen wie node.js können asynchrone Datenbankabfragefunktionen implementieren. Nach der Ausführung der SQL-Anweisung muss nicht darauf gewartet werden, dass die Datenbank Ergebnisse zurückgibt. Führen Sie weiterhin andere Codes aus. Wenn die Datenbank das Ergebnis zurückgibt, werden die Daten verarbeitet, z. B. das Rendern der Seite und das Senden der HTML-Seite an den Client. Auf diese Weise muss die Anwendung überhaupt nicht blockieren und warten. Diese Methode arbeitet sehr effizient.
Ist es möglich, ähnliche asynchrone, nicht blockierende MySQL-Abfragen in PHP zu implementieren? Verwenden Sie Github, um ein Projekt zu suchen und zu finden, das diese Funktion zu erfüllen scheint: https://github.com/kaja47/async-mysql. Der Code basiert auf React.PHP. Aber es ist nicht wirklich asynchrones SQL. Das Implementierungsprinzip besteht darin, alle 0,02 Sekunden einen Timer einzustellen und eine Abfrage durchzuführen. Obwohl es verwendet werden kann, ist es eine Verschwendung von CPU-Ressourcen. Nicht wirklich asynchrones MYSQL.
Swoole1.6.2 bietet jetzt zwei neue Funktionen, swoole_event_add und swoole_get_mysqli_sock, die verwendet werden können, um echtes PHP-asynchrones MySQL zu erreichen. Lassen Sie uns über die konkrete Umsetzung sprechen.
Code:
$db = new mysqli;
$db->connect('127.0.0.1', 'root', 'root', 'test' ); $db->reap_async_query();
var_dump($res->fetch_all(MYSQLI_ASSOC));
swoole_event_exit();
Zuerst eine Verbindung zu MySQL herstellen und anschließend SQL ausführen Bei erfolgreicher Verbindungsanweisung geben Sie im zweiten Parameter MYSQLI_ASYNC an. Zeigt an, dass diese Abfrage asynchron ist. Die Abfragefunktion kehrt sofort zurück und mysqli_result wird zu diesem Zeitpunkt nicht abgerufen.
Dann rufen Sie die Funktion swoole_get_mysqli_sock auf, um den Socket der MySQL-Verbindung abzurufen, und rufen Sie swoole_event_add auf, um ihn der Epoll-Ereignisschleife von swoole hinzuzufügen. Wenn die Datenbank das Ergebnis zurückgibt, wird die Funktion, die wir gerade formuliert haben, zurückgerufen.
Zu diesem Zeitpunkt rufen Sie mysqli_reap_async_query auf, um das Ergebnis abzurufen, und rufen Sie die Funktion fetch_all auf, um die Daten abzurufen.
Dieser Prozess ist vollständig asynchron und nicht blockierend, und es gibt keinen Code, der CPU verschwendet. Dieser Code kann auch in serverseitigen Programmen verwendet werden. Die spezifische Code-Implementierung wird später in einem ausführlichen Artikel beschrieben.