Problem
Normalerweise ist der Leistungsengpass einer Webanwendung die Datenbank. Denn normalerweise sind MySQL-Abfragen in PHP seriell. Das hei?t, wenn zwei SQL-Anweisungen angegeben sind, wartet die zweite SQL-Anweisung, bis die erste SQL-Anweisung ausgeführt wird, bevor sie diese ausführt. Wenn zu diesem Zeitpunkt zwei SQL-Anweisungen ausgeführt werden, betr?gt jede Ausführungszeit 50 ms und es kann 100 ms dauern, bis die Ausführung abgeschlossen ist. Da der Hauptgrund in der seriellen Ausführung von SQL liegt. K?nnen wir also die Ausführungsmethode ?ndern, um die Leistung zu verbessern? Die Antwort lautet: Ja. Wir k?nnen die Leistung durch asynchrone Ausführung verbessern.
Asynchron
Bei asynchroner Ausführung kann die Leistung erheblich verbessert werden. Wenn die asynchrone Methode verwendet wird, werden die beiden SQL-Anweisungen gleichzeitig ausgeführt und es kann 60 ms dauern, bis die Ausführung abgeschlossen ist.
Implementieren Sie
mysqli mysqlnd. Die asynchrone Abfragemethode wird in mysqlnd bereitgestellt und offiziell von PHP implementiert. Dies sind:
mysqlnd_async_query sendet eine Abfrageanforderung
mysqlnd_reap_async_query erh?lt die Abfrageergebnisse
Auf diese Weise müssen Sie nicht jedes Mal blockieren und auf die Abfrageergebnisse warten, nachdem Sie die Abfrageanforderung gesendet haben.
Der Implementierungscode lautet wie folgt:
<!--?php $host = '127.0.0.1'; $user = 'root'; $password = ''; $database = 'test'; /** * 期望得到額結(jié)果 * array( * 1 =--> int, * 2 => int, * 3 => int * ) */ $result = array(1=>0, 2=>0, 3=>0); //異步方式[并發(fā)請(qǐng)求] $time_start = microtime(true); $links = array(); foreach ($result as $key=>$value) { $obj = new mysqli($host, $user, $password, $database); $links[spl_object_hash($obj)] = array('value'=>$key, 'link'=>$obj); } $done = 0; $total = count($links); foreach ($links as $value) { $value['link']->query("SELECT COUNT(*) AS `total` FROM `demo` WHERE `value`={$value['value']}", MYSQLI_ASYNC); } do { $tmp = array(); foreach ($links as $value) { $tmp[] = $value['link']; } $read = $errors = $reject = $tmp; $re = mysqli_poll($read, $errors, $reject, 1); if (false === $re) { die('mysqli_poll failed'); } elseif ($re < 1) { continue; } foreach ($read as $link) { $sql_result = $link->reap_async_query(); if (is_object($sql_result)) { $sql_result_array = $sql_result->fetch_array(MYSQLI_ASSOC);//只有一行 $sql_result->free(); $hash = spl_object_hash($link); $key_in_result = $links[$hash]['value']; $result[$key_in_result] = $sql_result_array['total']; } else { echo $link->error, "\n"; } $done++; } foreach ($errors as $link) { echo $link->error, "1\n"; $done++; } foreach ($reject as $link) { printf("server is busy, client was rejected.\n", $link->connect_error, $link->error); //這個(gè)地方別再$done++了。 } } while ($done<$total); var_dump($result); echo "ASYNC_QUERY_TIME:", microtime(true)-$time_start, "\n"; $link = end($links); $link = $link['link']; echo "\n";
Fazit
Mysql-Datenbank startet einen separaten Thread für die Verarbeitung jeder Abfrageanforderung. Wenn der MySQL-Server zu viele Threads startet, führt der Threadwechsel zwangsl?ufig zu einer hohen Systemlast. Wenn die Auslastung der MySQL-Datenbank nicht hoch ist, ist die Verwendung einer asynchronen Abfrage immer noch eine gute Wahl.
Referenzdokument
http://www.walu.cc/php/async-mysql-query.md

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)