旗下导航:搜·么
当前位置:网站首页 > PHP框架 > Workerman > 正文

workerman写mysql连接池【workerman】,workerman,mysql

作者:搜搜PHP网发布时间:2019-12-20分类:Workerman浏览:113


导读:起首要相识为什么用衔接池,衔接池能为你处理什么问题衔接池重要的作用1、削减与数据效劳器竖立TCP衔接三次握手及衔接封闭四次挥手的开支,从而下降客户端和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();

更多workerman学问请关注workerman教程栏目。

以上就是workerman写mysql衔接池的细致内容,更多请关注ki4网别的相干文章!

标签:workermanmysql