网络编程
位置:首页>> 网络编程>> 数据库>> workerman写mysql连接池的实例代码

workerman写mysql连接池的实例代码

作者:尚  发布时间:2024-01-20 02:52:26 

标签:workerman,mysql,连接池

首先要了解为什么用连接池,连接池能为你解决什么问题

连接池主要的作用:

1、减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间

2、减少数据库的并发连接数,即解决应用服务器过多导致的数据库 too many connections 问题

如果是为了解决问题1

则在workerman中数据库连接池不是最高效的方法,反而是自找麻烦的做法。由于PHP是单进程单线程的,使用PHP实现数据库连接池,肯定需要用单独的进程去做,那么就会涉及到进程间的通讯,使得原本和mysql直接通讯的过程变成 与连接池再到mysql的通讯,增加了应用端的负载。

解决问题1最高效的方法是为每个业务进程建立一个数据库单例(例如workerman提供的DB类),实现数据库长连接,这样每个进程的所有请求都使用自己的这一个数据库长连接,整个进程的生命周期只有一次TCP握手和断开连接挥手的开销,并且应用与mysql直接通讯,没有连接池那样中间一层进程间IPC通讯,性能是最高的,没有之一。

如果是为了问题2

首先看下自己到底有多少台应用服务器,每台服务器与mysql有多收并发连接。假如你只有10台应用服务器,每个服务器50个进程,每个进程1个数据库连接,那么到mysql服务端总共只有10*50=500个并发连接(并非活跃连接),500个并发连接对于mysql来说就是小菜一碟,为了解决问题2完全没有使用连接池的必要。

假如你有1000台应用服务器,那么连接池是有必要的,但是这个连接池不能是运行在本地应用服务器上的连接池,因为1000台应用服务器就有1000个连接池,即使每个连接池只开10个连接,那么数据库的连接数也会轻松打满。所以不要指望在当前服务器上开几个task进程实现的连接池就能解决这个问题。

1000台应用服务器的集群,每台服务器上搞几个进程实现连接池同样是不靠谱的方法。真正能够解决问题2的方法是建立一个独立的数据库连接池服务器或者说集群,全局管理所有的数据库链接。

综上所述,

如果单独是为了问题1实现php的mysql连接池,那么数据库单例是比所谓的连接池更简单更高效的做法。

如果是为了实现问题2,那么想必业务也有一定的规模了,如果真心是想用workerman做个单独的连接池集群,下面是大概简单的做法,建立一些task进程,每个进程创建一个数据库连接,task进程收到sql请求后发送给mysql服务器,mysql服务器返回后task进程再把结果发给sql发起者。

连接池代码类似如下 如果是多台服务器组成的连接池集群,前面最好加一个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));

};

在workerman中调用:


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

来源:https://www.php.cn/workerman/441718.html

0
投稿

猜你喜欢

  • 地图现在太常见了,几乎每天在地铁上都能看到卖地图的小贩,”09年新版北京旅游交通图,1块钱一份”,买的人多半是外地来旅游的,这些人需要地图来
  • 要想在不宽裕的页面展现丰富的内容,现在通用的做法使用tab,在一块区域通过tab切换来更换该区域的内容。这篇文章分析了tab设计很在理,今天
  • 本文实例讲述了python实现通过代理服务器访问远程url的方法。分享给大家供大家参考。具体如下:import urllibproxies
  • 交互设计是近几年流行的一个词语。现在市场上有许多资料来介绍什么是交互设计,如何做交互设计等。从场景,任务,用户,操作等分析。但由于受实际情况
  • 1、sys.stdin.readline()与inputimport sys# sys.stdin.readline() 相当于input,
  • 1. filter1.1 把一个序列中的空字符串删掉例如将[‘A’, ‘&
  • 本文实例为大家分享了利用python和OpenCV实现图像拼接,供大家参考,具体内容如下python+OpenCV实现image stitc
  • 前言:接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱。接口自动化包含2个部分,功能性的接口自
  • 前言在两种python循环语句的使用中,不仅仅是循环条件达到才能跳出循环体。所以,在对python函数进行阐述之前,先对跳出循环的简单语句块
  • 1,WITH TEMPLET意思是,生成的页面架构将采用某个已设定的模板,在此之前我的一篇教程中介绍过,希望各位在看本教程之前对ASP采用模
  • 1、凸包检测与凸缺陷定义凸包是将最外层的点连接起来构成的凸多边形,它能包含点击中所有的点。物体的凸包检测常应用在物体识别、手势识别及边界检测
  • 文章背景每隔几年,开放式Web应用程序安全项目就会对最关键的Web应用程序安全风险进行排名。自第一次报告以来,注入风险高居其位!在所有注入类
  • 楔子当有多个 IO 密集型的任务要被处理时,我们自然而然会想到多线程。但如果任务非常多,我们不可能每一个任务都启动一个线程去处理,这个时候最
  • (一)Python 是如何进行内存管理的?答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制⒈对象的引用计数机制Pyth
  • html_downloaderfrom urllib import requestdef download(url):   &nb
  • 用Python+ChatGPT批量生成论文概述做算法研究离不开阅读大量论文。从海量论文中找到需要的论文往往耗费算法团队不少的精力。ChatG
  • 一、DatasetDataset 类提供一种方式去获取数据及其标签主要有两个目的:获取每一个数据及其标签获取数据的总量大小1. 在控制台进行
  • 本文实例讲述了Yii2框架实现登陆添加验证码功能。分享给大家供大家参考,具体如下:models中LoginForm.phppublic $v
  • 相信很多人在使用正则表达式的时候都会遇到如下的语句:通过查阅正则表达式的API文档可以了解到正则表达式的语法知识:很多小伙伴就会产生疑问为什
  • 本文的爬虫教程分为四部:     1.从哪爬 where   &nbs
手机版 网络编程 asp之家 www.aspxhome.com