Maison  >  Article  >  cadre php  >  La méthode et la fonction de Workerman écrivant le pool de connexions MySQL

La méthode et la fonction de Workerman écrivant le pool de connexions MySQL

尚
avant
2020-01-19 17:52:004819parcourir

La méthode et la fonction de Workerman écrivant le pool de connexions MySQL

Tout d'abord, vous devez comprendre pourquoi le pool de connexions est utilisé et quels problèmes le pool de connexions peut résoudre pour vous

Les principales fonctions du pool de connexions :

1. Réduire et Le serveur de données établit la poignée de main à trois voies de la connexion TCP et ferme la connexion au prix de quatre poignées de main, réduisant ainsi la charge sur le client et le serveur MySQL et raccourcissant le temps de réponse à la demande

2. Réduisez le nombre de connexions simultanées à la base de données, ce qui résout le problème de surcharge du serveur d'applications. Le problème du trop grand nombre de connexions dans la base de données causées par un trop grand nombre de

Si c'est le cas. pour résoudre le problème 1

, alors le pool de connexions à la base de données dans Workerman n'est pas la méthode la plus efficace, mais il pose des problèmes. Étant donné que PHP est monoprocessus et monothread, l'utilisation de PHP pour implémenter un pool de connexions à une base de données nécessite définitivement un processus distinct, qui impliquera une communication inter-processus, faisant de la communication directe originale avec MySQL un processus avec le pool de connexions, puis à nouveau. La communication MySQL augmente la charge côté application.

Le moyen le plus efficace de résoudre le problème 1 est d'établir un singleton de base de données pour chaque processus métier (comme la classe DB fournie par Workerman) et d'implémenter une longue connexion à la base de données, afin que toutes les requêtes de chaque processus utilisent son propre Pour une longue connexion à la base de données, il n'y a qu'une seule prise de contact TCP et une seule surcharge de vague de déconnexion dans tout le cycle de vie du processus, et l'application communique directement avec mysql Il n'y a pas de couche intermédiaire de communication IPC inter-processus comme un pool de connexions, et le. la performance est la plus élevée d’entre eux.

Si c'est pour la question 2

Vérifiez d'abord le nombre de serveurs d'applications dont vous disposez et le nombre de connexions simultanées de chaque serveur à MySQL. Si vous n'avez que 10 serveurs d'applications, chaque serveur a 50 processus et chaque processus a 1 connexion à la base de données, alors il n'y aura qu'un total de 10*50=500 connexions simultanées au serveur mysql (connexions non actives) et 500 connexions simultanées connexions pour mysql C'est un jeu d'enfant Pour résoudre le problème 2, il n'est pas nécessaire d'utiliser un pool de connexions.

Si vous disposez de 1 000 serveurs d'applications, alors un pool de connexions est nécessaire, mais ce pool de connexions ne peut pas être un pool de connexions exécuté sur le serveur d'applications local, car il existe 1 000 pools de connexions pour 1 000 serveurs d'applications, même si chacun. le pool de connexions n'ouvre que 10 connexions, le nombre de connexions dans la base de données sera facilement rempli. Ne vous attendez donc pas à ce que l'ouverture d'un pool de connexions implémenté par plusieurs processus de tâches sur le serveur actuel résolve ce problème.

Dans un cluster de 1 000 serveurs d'applications, mettre en place plusieurs processus sur chaque serveur pour mettre en œuvre le pooling de connexions est également une méthode peu fiable. La véritable façon de résoudre le problème 2 consiste à établir un serveur ou un cluster de pool de connexions de base de données indépendant pour gérer globalement tous les liens de base de données.

Pour résumer,

Si vous implémentez le pool de connexions MySQL de PHP uniquement pour la question 1, alors le singleton de base de données est une approche plus simple et plus efficace que ce qu'on appelle le pool de connexions.

S'il s'agit de réaliser la question 2, alors l'entreprise doit avoir une certaine échelle. Si vous souhaitez vraiment utiliser Workerman pour créer un cluster de pools de connexions séparé, voici un moyen simple de créer des processus de tâches, each Le processus crée une connexion à la base de données.Une fois que le processus de tâche a reçu la requête SQL, il l'envoie au serveur MySQL. Après le retour du serveur MySQL, le processus de tâche envoie le résultat à l'initiateur SQL.

Le code du pool de connexions est similaire au suivant. S'il s'agit d'un cluster de pool de connexions composé de plusieurs serveurs, il est préférable d'ajouter un lvs devant :

// 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));
};

Appel à workererman :

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();

Plus Pour les connaissances Workerman, veuillez faire attention à la colonne Workerman Tutorial sur le site Web PHP chinois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer