workerman如何写mysql连接池,连接池什么用
Admin 2022-07-22 群英技术资讯 1934 次浏览
这篇文章主要介绍了workerman如何写mysql连接池,连接池什么用相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇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();
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Laravel 是一个流行的开源 PHP 框架,以其强大的安全性和简单而复杂的编码架构而闻名。本篇文章就给大家带来了关于Laravel 性能优化的 18 个必备知识,希望对需要的朋友有所帮助!
swoole的UDP服务器与TCP服务器不同,UDP没有连接的概念。Http服务器只需要关注请求响应即可,所以只需要监听一个onRequest事件。WebSocket服务器是建立在Http服务器之上的长连接服务器。
在laravel中,队列可以用于允许在表的前端进行删除操作,而在表的后端进行插入操作;队列是一种操作受限制的线性表,进行插入操作的称为队尾,删除操作的端被称为队头,队列可以将耗时任务的处理往后推延,能够提升web请求的响应速度。
这篇文章主要给大家介绍了关于php如何比较两个浮点数是否相等的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
今天小编就为大家分享一篇Laravel 5.5 实现禁用用户注册示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008