Heim >Backend-Entwicklung >PHP-Tutorial >PHP implementiert echtes asynchrones MySQL

PHP implementiert echtes asynchrones MySQL

巴扎黑
巴扎黑Original
2016-11-21 14:03:471487Durchsuche

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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn