php 如何实现 数据库 连接池

一、总结

一句话总结:

php+sqlrelay+mysql实现连接池及读写负载均衡
master-slave模式增加并发。
sqlrelay 解决连接池问题以及实现读写分离的均衡负载。

为了有效的解决并发访问的瓶颈,利用多台数据库master-slave的模式来增加web的并发访问量

sqlrelay配置3个instance A/B/C,A负责从Master和slave读取数据,B负责写数据,且只写Master,C为router负责调度应用。php通过A还是通过B连接 数据库。在实际配置中,由于master承担了读写操作,那么在instance A的配置中,可以把从Master的连接稍微降小,把从slave连接读取数据的连接数稍稍增大以此进行平衡。

1、php能做数据库连接池么?

php脚本不能:php 脚本本身的确是不能做连接池的,因为php脚本在解释执行完毕后会释放所有内存资源,当然其中用到的数据库连接也会被释放
php中间件可以:但一些中间件也是可以做为连接 池的,只要提供php的相关驱动,所以可以自己做php的连接池,但是绝对作不了100% pure php的连接池。
比如mysql_pconnect:mysql_pconnect是php内建的一个模拟连接池,但这套机制不是用php脚本实现的。 但是一次请求可以复用链接,减少new带来的消耗。

2、数据库连接池节约时间的原因是什么?

数据库连接池的作用主要是节省打开数据库的时间

3、数据库连接池原理是什么?

缓存数据库连接

数据库连接池机制预先打开N个数据库连接,把它们缓存起来,当需要使用数据库的时候就直接使用这些已经打开的连接,从而节省了时间。连接池的存在基本上消除了数据库连接断开的时间与cpu开销。

4、php数据库连接池解决方案有哪些?

1、pconnect(持久连接):pconnect的原理,和连接池差不多的,都是程序关闭连接,但PHP并不真正关闭,再次打开时,直接使用可用的连接。如果因为访问量太大出现Mysql应该配置 Mysql 数据库服务的my.cnf 里的 max_connection 的值,如max_connections = 2000。
2、mysql proxy。
3、memcache:针对mysql的一个数据库缓存实现。
4、SQL Relay:一个开源的数据库池连接代理服务器。支持Oracle、MySQL、mSQL、PostgreSQL、Sybase、MS SQL Server、IBM DB2、Sybase、SQLite、Lago、 ODBC、MS Access等。

二、PHP连接池详解

转自:PHP连接池详解-php教程-PHP中文网
http://www.php.cn/php-weizijiaocheng-390224.html

php 脚本本身的确是不能做连接池的,因为php脚本在解释执行完毕后会释放所有内存资源,当然其中用到的数据库连接也会被释放,但一些中间件也是可以做为连接 池的,只要提供php的相关驱动,所以可以自己做php的连接池,但是绝对作不了100% pure php的连接池。mysql_pconnect是php内建的一个模拟连接池,但这套机制不是用php脚本实现的。 但是一次请求可以复用链接,减少new带来的消耗。

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    <?php 

         class ConnecToDB 

         {   

             private static $instance=array(); 

             //防止外部创建新的数据库连接类 

             private function _constuct(){} 

             static public function Connect() 

             {     

                 //连接类不够100,创建新类 

                 if(count(self::$instance)<100) 

                 

                     $newDb=new self(); 

                     self::$instance[]=$newDb

                     return $newDb::ConDB(); 

                 

                 else

                 {     

                     //随机数保证数据库连接均衡 

                     $i=rand(0,99); 

                     $new_obj=self::$instance[$i]; 

                     return $new_obj::ConDB(); 

                 

             

             static private function ConDB() 

             

                 try

                 

                     $connec=mysql_connect("127.0.0.1","数据库账户","数据库密码"); 

                     mysql_select_db("数据库名");//选择数据库   

        

                 

                 catch(Exception $e

                 

                     $errors[]=$e->getMessage(); 

                   }

    }

连接池的作用主要是节省打开数据库的时间。连接池机制预先打开N个数据库连接,把它们缓存起来,当需要使用数据库的时候就直接使用这些已经打开的连接,从而节省了时间。连接池的存在基本上消除了数据库连接断开的时间与cpu开销。 
连接池解决方案:
1、pconnect(持久连接):pconnect的原理,和连接池差不多的,都是程序关闭连接,但PHP并不真正关闭,再次打开时,直接使用可用的连接。
如果因为访问量太大出现Mysql应该配置 Mysql 数据库服务的my.cnf 里的 max_connection 的值,如max_connections = 2000。
2、mysql proxy。
3、memcache:针对mysql的一个数据库缓存实现。
4、SQL Relay:一个开源的数据库池连接代理服务器。支持Oracle、MySQL、mSQL、PostgreSQL、Sybase、MS SQL Server、IBM DB2、Sybase、SQLite、Lago、 ODBC、MS Access等。
安装与配置[SQL SERVER](http://blog.sina.com.cn/s/blog_4dd475390100hbck.html),安装SQL Relay需要先安装Rudiments:
1、安装Rudiments:
# tar vxzf rudiments-0.28.2.tar.gz
# cd rudiments-0.28.2
# ./configure --prefix=/usr/local/rudiments
# make
# make install
2、安装SQL Relay:
# tar vxzf sqlrelay-0.36.4.tar.gz
# cd sqlrelay-0.36.4
# ./configure --prefix=/usr/local/sqlrelay --with-rudiments-prefix=/usr/local/rudiments --with-mysql-prefix=MySQL安装路径 --with-freetds-prefix=FreeTDS安装路径 --with-oracle-home=Oracle安装路径 --with-php-prefix=PHP安装路径
# make
# make install
3、 设置PHP:修改 php.ini中extension_dir = "./",把以上内容修改为:extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922"。
根据PHP安装的路径来修改,并不是每个版本的PHP都是这个路径,在php.ini中添加如下内容extension=sql_relay.so。
4、修改SQL Relay的配置文件
# cd /usr/local/sqlrelay/etc
# cp sqlrelay.conf.example sqlrelay.conf
把sqlrelay.conf的内容改为:

1

2

3

4

5

6

7

8

9

10

11

12

<?xml version="1.0"?>

<!DOCTYPE instances SYSTEM "sqlrelay.dtd">

<instances>

<instance id="msdetest" port="9000" socket="/tmp/msdetest.socket" dbase="freetds" connections="5" maxconnections="10" maxqueuelength="0" growby="1" ttl="60" endofsession="commit" sessiontimeout="5" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass">

<users>

<user user="sa" password="sa"/>

</users>

<connections>

<connection connectionid="msdetest" string="server=msde;db=pubs;user=sa;password=sa;" metric="1"/>

</connections>

</instance>

</instances>

启动SQL Relay,并测试;
1、启动 SQL Relay
# export PATH=$PATH:/usr/local/sqlrelay/bin
# sqlr-start -id msdetest
2、使用SQL工具:
# sqlrsh -id msdetest
可以直接输入SQL语句停止SQL Relay:# sqlr-stop msdetest
3、测试PHP,写一个PHP文 件,内容如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?

$con=sqlrcon_alloc("msdetest",9000,"/tmp/msdetest.socket","sa","sa",0,1);

$cur=sqlrcur_alloc($con);

sqlrcur_sendQuery($cur,"select * from t_gifts");

for ($row=0; $row<sqlrcur_rowCount($cur); $row++) {

for ($col=0; $col<sqlrcur_colCount($cur); $col++) {

echo sqlrcur_getField($cur,$row,$col);

echo ",";

}

echo "<br>\n";

}

sqlrcur_free($cur);

sqlrcon_free($con);

?>

php+sqlrelay+mysql实现连接池及读写负载均衡:
为了有效的解决并发访问的瓶颈,利用多台数据库master-slave的模式来增加web的并发访问量。master-slave模式是为了数据同步的问题。
sqlrelay 解决连接池问题以及实现读写分离的均衡负载。sqlrelay配置3个instance A/B/C,A负责从Master和slave读取数据,B负责写数据,且只写Master,C为router负责调度应用。php通过A还是通过B连接 数据库。在实际配置中,由于master承担了读写操作,那么在instance A的配置中,可以把从Master的连接稍微降小,把从slave连接读取数据的连接数稍稍增大以此进行平衡。
配置与应用(http://blog.163.com/lgh_2002/blog/static/4401752620107393057989/):

一、MySQL master/slave配置
################
#mster/slave配置
################
master:192.168.1.51
slave:192.168.1.50
1、master配置
/etc/my.cnf 中加入
binlog-do-db=book book为数据库名确保
server-id=1
log-bin=mysql-bin
授权给rep用户进行复制操作
GRANT REPLICATION SLAVE ON book.* TO rep@192.168.1.50 IDENTIFIED BY '123456';
重启master服务
2、配置slave
vi /etc/my.cnf
设置下面4行
server-id = 2
master-host = 192.168.1.51
master-user = rep
master-password = 123456
重启slave
3、把master的原始数据导入slave。

二、sqlrelay配置
当前行业中比较流行的连接池解决方案几乎都不支持php,经过多番努力终于在找到了一个开源的连接池技术--------sqlrelay。
sqlreplay支持的语言:C C++ Perl Python PHP Ruby Java TCL Zope。
sqlreplay支持的数据库:Oracle MySQL mSQL PostgreSQL Sybase MS SQL Server IBM DB2 Interbase Sybase SQLite ODBC MS Access
基本思路:
1、配置2个实例用以最终处理业务
clubs-read
clubi-write
其中读取的 instance分别配置两个连接,且两个连接启动对等的连接数。
2、配置一个instance来调度读写操作,即clubr
通过router来区分读写连接不同的mysql数据库。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?xml version="1.0"?>

<!DOCTYPE instances SYSTEM "sqlrelay.dtd">

<instances>

<!-- club Instance -->

<instance id="clubs" port="9002" socket="/tmp/clubs.socket" dbase="mysql" connections="10" maxconnections="20" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0">

<users>

<user user="club" password="edb:club"/>

</users>

<connections>

<connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>

<connection connectionid="slave50" string="host=192.168.1.50;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>

</connections>

</instance>

<instance id="clubi" port="9003" socket="/tmp/clubi.socket" dbase="mysql" connections="10" maxconnections="40" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0">

<users>

<user user="club" password="edb:club"/>

</users>

<connections>

<connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>

</connections>

</instance>

php.ini文件在系统中的优先级:PhpIniDir、注册表键值、环境变量%PHPRC%、PHP5的根目录(For CLI),或者WWW的根目录(For SAPI moudles)、Windows目录(C:\windows)。
PHP5特征:加入了面向对象机制、对于XML的复杂处理、异常处理机制。
PHP6特征:
支持Unicode:虽然Unicode占用较多的空间,但Unicode带来的便利性,远超过占用空间的缺点。PHP也可以在.ini文件中设定是否开启支持Unicode。
命名空间:命名空间是一种避免因函数或者类之间的命名冲突,而使你的函数和类以及方法无法读取,而不使用前缀命名惯例的一种方法。
PHP6.0令人激动的Web 2.0特性。
SOAP: 简单对象访问协议 (SOAP:Simple Object Access Protocol)SOAP 可以和现存的许多因特网协议和格式结合使用,包括:HTTP、SMTP、MIME、RPC。
XML: 从PHP 5.1版本开始,XMLReader和XMLWriter就已经包含在PHP内核,它可以让它可以让XML编程更加轻松。
Register Globals 将被移除:它虽满方便的,但是却忽略会带来程序上安全性的隐患,PHP4.3.x版开始时,此项默认设置值即是关闭状态,PHP6后PHP3将完全无法使用。
Magic Quotes 将消失:Magic Quotes主要是自动转义需要转义的字符,此项功能移除叶符合大多数PHP开发者的心声。
Safe Mode 取消。
’var’ 别名为 ‘public’:在类中的var声明变成public的别名,相信是为了兼容PHP5而作的决定,PHP6现在也可以称作为OO语言了。
通过引用返回将出错:现在透过引用返回编译器将会报错 例如$a =& new b()、function &c(),OO语言默认就是引用,所以不需要再使用&了。 
zend.ze1 compatbility mode 将被移去 Zend.ze1相容模式将被移去PHP5是为兼容旧有PHP4,所以在.ini中可选择是否开启相容模式。
Freetype 1 and GD 1 support 将不见这两个是很久的Libs,所以不再支持,GD1早已被现在的GD2取代了。
dl() 被移到 SAPI 中dl()主要是让设计师加载extension Libs,现在被移到 SAPI 中。
Register Long Array 去除从PHP5起默认是关闭,再PHP6中正式移除。
Extension的变更:如XMLReader、XMLWriter将不再是以Extension的方式出现,他们将被移入到PHP的核心之中默认是开启。
ereg extension将被放入PECL,代表着它将被移出PHP核心,这也是为了让路给新的正则表达式extension,此外,Fileinfo extension 也将被导入PHP的核心之中。
APC将被导入核心:这是一个提高PHP性能的功能,现在它将被放入PHP核心中,并且可以选择是否启用APC。
告别ASP风格的起始标签:原来是为了取悦ASP开发者转向使用PHP,现今已经不再需要这种做法了。
PHP6.0除了增加新特性,一些会给系统带来不稳定因素和安全隐患的特性也将被取消,取消列表:magic_quotes、register_globals、register_long_arrays、safe_mode、magic_quotes。

 

php 如何实现 数据库 连接池的更多相关文章

  1. hasura graphql-engine集成pgbouncer 连接池工具

    pgbouncer 是一个轻量的pg 连接池工具,我们可以和hasura graphql-engine集成起来,进行连接的一些优化 环境准备 docker-compose 文件 version: '3 ...

  2. springboot使用之一:连接生产数据库,添加连接池

    项目中,难免遇到连接数据库的情形,目前来说springboot连接mybatis有两种,我这边使用的是mybatis官方提供XML方式的整合. 后面,对项目进行完善,引入了连接池,PageHelper ...

  3. 数据库最大连接池max pool size

    本文导读:Max Pool Size如果未设置则默认为100,理论最大值为32767.最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影 ...

  4. DBCP之----"数据库"与"连接池"的连接建立过程

    1 public class DBCPTest { 2 /* 3 * 使用BasicDataSource类,通过url, 4 和diverClass,username,password, 5 几个参数 ...

  5. ASP.NET MVC- EF返回连接池用ADO.NET方式访问数据库

    用习惯了ADO.NET的方式去访问数据库,虽然ADO.NET写的代码没有EF简洁,可是也并不麻烦.而且EF在进行多表查询的那种方式是,EF需要先去数据库里定义外键,再进去一次代码生成,然后才能用INC ...

  6. 用连接池提高Servlet访问数据库的效率

    Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本.Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据.本文介绍 ...

  7. JavaEE连接池泄漏问题检测Oracle数据库

    1.项目环境 项目是典型的轻量级JavaEE项目,使用SSH框架构建,数据源使用DBCP管理,和Spring进行了整合. 项目数据库使用Oracle数据库. 项目DBCP配置内容如下 ###### D ...

  8. c3p0、dbcp、tomcat jdbc pool 连接池配置简介及常用数据库的driverClass和驱动包

    [-] DBCP连接池配置 dbcp jar包 c3p0连接池配置 c3p0 jar包 jdbc-pool连接池配置 jdbc-pool jar包 常用数据库的driverClass和jdbcUrl ...

  9. Spring框架中 配置c3p0连接池 完成对数据库的访问

    开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...

随机推荐

  1. bootstrap的模态框的使用

    bootstrap的模态框 如果只想单独使用模态框功能,可以单独引入modal.js,和bootstrap的css,在bootstrap的包中,可引入bootstrap.js. 用法 通过data属性 ...

  2. djanjo中url路由匹配规则是啥意思

    一,django路由匹配规则的本质是通过正则表达式对用户的url进行匹配. 1,r 是正则表达式中防止转义的符号,例如在python/n代表换行,加上r就不换行了. 2,$ 正则表达式中表示以什么什么 ...

  3. gdb流程控制(例: 循环打印数组)

    参考:https://blog.csdn.net/justlinux2010/article/details/9453151 循环/条件 在gdb的脚本中循环遍历整个哈希表,并且加上判断条件来进行统计 ...

  4. Webx.0-Web2.0:Web2.0

    ylbtech-Webx.0-Web2.0:Web2.0 Web2.0 是相对于Web1.0 的新的时代.指的是一个利用Web的平台,由用户主导而生成的内容互联网产品模式,为了区别传统由网站雇员主导生 ...

  5. 23. requests安装与使用

    Windows下安装requests 在介绍requests库之前,先贴一下requests官网,当然也可以访问requests中文网站 requests官网给出以下介绍:Requests 唯一的一个 ...

  6. 20. Cookie 和 Session

    之前我们在Cookie 和Session是什么?已经说过Cookie 和Session,但是为了保证系列的完整性,我们决定重新说一遍,当然可能会有一些区别,建议先从Cookie 和Session是什么 ...

  7. Sap Netweaver命令执行

    URL/ctc/servlet/com.sap.ctc.util.ConfigServlet?param=com.sap.ctc.util.FileSystemConfig;EXECUTE_CMD;C ...

  8. python学习笔记:网络请求——requests模块

    上面讲过的urllib模块太麻烦了,还有一个比较方便的模块,就是requests模块,好用到你怀疑人生·^_^,一定要会哦 需要安装,pip install requests即可,下面是request ...

  9. 在mac版virtual box中安装ubuntu虚拟机的NAT/Host-Only网络配置踩坑记录

    之前用惯了vmware和parallels desktop,网络配置十分智能,基本不用自己配置.由于版权原因,工作电脑上换了免费的virtual box用,四五年都完全在虚拟机里干活的本菜鸡居然在虚拟 ...

  10. 带你看懂LayoutInflater中inflate方法

    关于inflate问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个东东 ...