Zunächst müssen Sie verstehen, warum der Verbindungspool verwendet wird und welche Probleme der Verbindungspool für Sie lösen kann
Die Hauptfunktion des Verbindungspools
1. Reduzieren und Daten Der Server stellt eine TCP-Verbindung mit einem Drei-Wege-Handshake her und schließt die Verbindung mit einem Vier-Wege-Handshake, 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, dh lösen Sie das Problem zu vieler Anwendungsserver. Das durch zu viele Verbindungen verursachte Datenbankverbindungsproblem
Wenn es Problem 1 lösen soll
, dann ist der Datenbankverbindungspool in Workerman nicht die effizienteste Methode, sondern bereitet 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 Verbindungspoolcode ähnelt dem folgenden. Wenn es sich um einen Verbindungspoolcluster handelt, der aus mehreren Servern besteht, fügen Sie am besten ein lvs
// 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)); };
hinzu, um <🎜 aufzurufen >
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();
Workerman-Tutorial.
Das obige ist der detaillierte Inhalt vonWorkerman schreibt MySQL-Verbindungspool. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!