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
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()
{
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。
我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站:
【读书编程笔记】fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
在校每年国奖、每年专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。
2025-04-30:宅加太忙,特此在网上找女朋友,坐标上海,非诚勿扰,vx:fan404006308
录播课资料github地址:https://github.com/fry404006308/fry_course_materials
感悟总结
其它重要感悟总结
感悟总结200813
最近心境200830
最近心境201019
201218-210205
来源:https://www.cnblogs.com/Renyi-Fan/p/10913473.html |