Heim >PHP-Framework >Workerman >Die Methode und Funktion des Workerman beim Schreiben des MySQL-Verbindungspools
Zunächst müssen Sie verstehen, warum Verbindungspooling verwendet wird und welche Probleme der Verbindungspool für Sie lösen kann
Die Hauptfunktionen von Verbindungspooling:
1. Reduzieren und Der Datenserver stellt den Drei-Wege-Handshake der TCP-Verbindung her und schließt die Verbindung mit den Kosten von vier Handshakes, wodurch die Belastung des Clients und des MySQL-Servers verringert und die Antwortzeit der Anforderung verkürzt wird
2. Reduzieren Sie die Anzahl gleichzeitiger Verbindungen zur Datenbank, wodurch das Problem der Überlastung des Anwendungsservers gelöst wird. Das Problem zu vieler Verbindungen in der Datenbank wird durch zu viele
verursacht Um Problem 1 zu lösen
, ist der Datenbankverbindungspool in Workerman nicht die effizienteste Methode, erfordert jedoch Probleme. Da es sich bei PHP um einen Einzelprozess und einen Einzelthread handelt, ist für die Verwendung von PHP zum Implementieren eines Datenbankverbindungspools definitiv ein separater Prozess erforderlich, der die Kommunikation zwischen Prozessen umfasst, wodurch die ursprüngliche direkte Kommunikation mit MySQL zu einem Prozess mit dem Verbindungspool und dann wieder wird . MySQL-Kommunikation erhöht die Belastung auf der Anwendungsseite.
Der effizienteste Weg, Problem 1 zu lösen, besteht darin, für jeden Geschäftsprozess einen Datenbank-Singleton einzurichten (z. B. die von Workerman bereitgestellte DB-Klasse) und eine lange Datenbankverbindung zu implementieren, sodass alle Anforderungen jedes Prozesses diese verwenden Für eine lange Datenbankverbindung gibt es im gesamten Prozesslebenszyklus nur einen TCP-Handshake und einen Verbindungswellen-Overhead, und die Anwendung kommuniziert direkt mit MySQL. Es gibt keine Zwischenschicht der IPC-Kommunikation zwischen Prozessen wie einen Verbindungspool Die Leistung ist unter ihnen die höchste.
Wenn es sich um Frage 2 handelt
Überprüfen Sie zunächst, wie viele Anwendungsserver Sie haben und wie viele gleichzeitige Verbindungen jeder Server zu MySQL hat. Wenn Sie nur 10 Anwendungsserver haben, jeder Server 50 Prozesse hat und jeder Prozess 1 Datenbankverbindung hat, dann gibt es insgesamt nur 10 * 50 = 500 gleichzeitige Verbindungen zum MySQL-Server (keine aktiven Verbindungen) und 500 gleichzeitige Verbindungen für MySQL Es ist ein Kinderspiel. Um Problem 2 zu lösen, ist es nicht erforderlich, einen Verbindungspool zu verwenden.
Wenn Sie 1.000 Anwendungsserver haben, ist ein Verbindungspool erforderlich, dieser Verbindungspool kann jedoch kein Verbindungspool sein, der auf dem lokalen Anwendungsserver ausgeführt wird, da es 1.000 Verbindungspools für 1.000 Anwendungsserver gibt Da der Verbindungspool nur 10 Verbindungen öffnet, kann die Anzahl der Verbindungen in der Datenbank problemlos gefüllt werden. Erwarten Sie also nicht, dass das Öffnen eines Verbindungspools, der von mehreren Task-Prozessen auf dem aktuellen Server implementiert wird, dieses Problem lösen wird.
In einem Cluster von 1.000 Anwendungsservern ist die Einrichtung mehrerer Prozesse auf jedem Server zur Implementierung von Verbindungspooling ebenfalls eine unzuverlässige Methode. Der eigentliche Weg, Problem 2 zu lösen, besteht darin, einen unabhängigen Datenbankverbindungspoolserver oder -cluster einzurichten, um alle Datenbankverbindungen global zu verwalten.
Zusammenfassend:
Wenn Sie den MySQL-Verbindungspool von PHP ausschließlich für Frage 1 implementieren, ist der Datenbank-Singleton ein einfacherer und effizienterer Ansatz als der sogenannte Verbindungspool.
Um Frage 2 zu realisieren, muss das Unternehmen eine bestimmte Größe haben. Wenn Sie Workerman wirklich zum Aufbau eines separaten Verbindungspool-Clusters verwenden möchten, finden Sie im Folgenden eine einfache Möglichkeit, einige Aufgabenprozesse zu erstellen. Jeder Prozess erstellt eine Datenbankverbindung, nachdem der Task-Prozess die SQL-Anfrage erhalten hat. Nachdem der MySQL-Server zurückgegeben wurde, sendet der Task-Prozess das Ergebnis an den SQL-Initiator.
Der Verbindungspool-Code ähnelt dem folgenden. Wenn es sich um einen Verbindungspool-Cluster handelt, der aus mehreren Servern besteht, fügen Sie am besten ein lvs vor:
// task worker,使用Text协议 $task_worker = new Worker('Text://0.0.0.0:1234'); $task_worker->count = 64; $task_worker->name = 'MysqlTask'; $task_worker->onMessage = function($connection, $sql) { // 执行sql.... 得到结果,这里省略.... $sql_result = your_mysql_query($sql); // 发送结果 $connection->send(json_encode($sql_result)); };
Rufen Sie workerman auf:
use \Workerman\Connection\AsyncTcpConnection; // 与远程连接池服务建立异步链接,ip为远程连接池服务的ip,如果是集群就是lvs的ip $sql_connection = new AsyncTcpConnection('Text://ip:1234'); // 发送sql $sql_connection->send("SELECT ... FROM ....."); // 异步获得sql结果 $sql_connection->onMessage = function($sql_connection, $sql_result) { // 这里只是打印结果 var_dump(json_decode($task_result)); }; // 执行异步链接 $sql_connection->connect();
Weitere Informationen zu Workerman-Kenntnissen finden Sie in der Spalte Workerman-Tutorial auf der chinesischen PHP-Website.
Das obige ist der detaillierte Inhalt vonDie Methode und Funktion des Workerman beim Schreiben des MySQL-Verbindungspools. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!