钟山风雨起苍黄 發表於 2019-6-11 14:13:00

php 如何实现 数据库 连接池

<h1 style="text-align: center">php 如何实现&nbsp;数据库 连接池</h1>
<h2>一、总结</h2>
<h3>一句话总结:</h3>
<h5>php+sqlrelay+mysql实现连接池及读写负载均衡</h5>
<h5>master-slave模式增加并发。</h5>
<h5>sqlrelay 解决连接池问题以及实现读写分离的均衡负载。</h5>
<p>为了有效的解决并发访问的瓶颈,利用多台数据库master-slave的模式来增加web的并发访问量</p>
<p>sqlrelay配置3个instance A/B/C,A负责从Master和slave读取数据,B负责写数据,且只写Master,C为router负责调度应用。php通过A还是通过B连接 数据库。在实际配置中,由于master承担了读写操作,那么在instance A的配置中,可以把从Master的连接稍微降小,把从slave连接读取数据的连接数稍稍增大以此进行平衡。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>1、php能做数据库连接池么?</h3>
<h5>php脚本不能:php 脚本本身的确是不能做连接池的,因为php脚本在解释执行完毕后会释放所有内存资源,当然其中用到的数据库连接也会被释放</h5>
<h5>php中间件可以:但一些中间件也是可以做为连接 池的,只要提供php的相关驱动,所以可以自己做php的连接池,但是绝对作不了100% pure php的连接池。</h5>
<h5>比如mysql_pconnect:mysql_pconnect是php内建的一个模拟连接池,但这套机制不是用php脚本实现的。 但是一次请求可以复用链接,减少new带来的消耗。</h5>
<p>&nbsp;</p>
<h3>2、数据库连接池节约时间的原因是什么?</h3>
<h5>数据库连接池的作用主要是节省打开数据库的时间</h5>
<p>&nbsp;</p>
<h3>3、数据库连接池原理是什么?</h3>
<h5>缓存数据库连接</h5>
<p>数据库连接池机制预先打开N个数据库连接,把它们缓存起来,当需要使用数据库的时候就直接使用这些已经打开的连接,从而节省了时间。连接池的存在基本上消除了数据库连接断开的时间与cpu开销。</p>
<p>&nbsp;</p>
<h3>4、php数据库连接池解决方案有哪些?</h3>
<h5>1、pconnect(持久连接):pconnect的原理,和连接池差不多的,都是程序关闭连接,但PHP并不真正关闭,再次打开时,直接使用可用的连接。如果因为访问量太大出现Mysql应该配置 Mysql 数据库服务的my.cnf 里的 max_connection 的值,如max_connections = 2000。</h5>
<h5>2、mysql proxy。</h5>
<h5>3、memcache:针对mysql的一个数据库缓存实现。</h5>
<h5>4、SQL Relay:一个开源的数据库池连接代理服务器。支持Oracle、MySQL、mSQL、PostgreSQL、Sybase、MS SQL Server、IBM DB2、Sybase、SQLite、Lago、 ODBC、MS Access等。</h5>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>二、PHP连接池详解</h2>
<p>转自:PHP连接池详解-php教程-PHP中文网<br>http://www.php.cn/php-weizijiaocheng-390224.html</p>
<p>&nbsp;</p>
<p>php 脚本本身的确是不能做连接池的,因为php脚本在解释执行完毕后会释放所有内存资源,当然其中用到的数据库连接也会被释放,但一些中间件也是可以做为连接 池的,只要提供php的相关驱动,所以可以自己做php的连接池,但是绝对作不了100% pure php的连接池。mysql_pconnect是php内建的一个模拟连接池,但这套机制不是用php脚本实现的。 但是一次请求可以复用链接,减少new带来的消耗。</p>
<ol class=" list-paddingleft-2">
<li>
<table class="syntaxhighlighterphp" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<p class="line number1 index0 alt2">1</p>
<p class="line number2 index1 alt1">2</p>
<p class="line number3 index2 alt2">3</p>
<p class="line number4 index3 alt1">4</p>
<p class="line number5 index4 alt2">5</p>
<p class="line number6 index5 alt1">6</p>
<p class="line number7 index6 alt2">7</p>
<p class="line number8 index7 alt1">8</p>
<p class="line number9 index8 alt2">9</p>
<p class="line number10 index9 alt1">10</p>
<p class="line number11 index10 alt2">11</p>
<p class="line number12 index11 alt1">12</p>
<p class="line number13 index12 alt2">13</p>
<p class="line number14 index13 alt1">14</p>
<p class="line number15 index14 alt2">15</p>
<p class="line number16 index15 alt1">16</p>
<p class="line number17 index16 alt2">17</p>
<p class="line number18 index17 alt1">18</p>
<p class="line number19 index18 alt2">19</p>
<p class="line number20 index19 alt1">20</p>
<p class="line number21 index20 alt2">21</p>
<p class="line number22 index21 alt1">22</p>
<p class="line number23 index22 alt2">23</p>
<p class="line number24 index23 alt1">24</p>
<p class="line number25 index24 alt2">25</p>
<p class="line number26 index25 alt1">26</p>
<p class="line number27 index26 alt2">27</p>
<p class="line number28 index27 alt1">28</p>
<p class="line number29 index28 alt2">29</p>
<p class="line number30 index29 alt1">30</p>
<p class="line number31 index30 alt2">31</p>
<p class="line number32 index31 alt1">32</p>
<p class="line number33 index32 alt2">33</p>
<p class="line number34 index33 alt1">34</p>
<p class="line number35 index34 alt2">35</p>
<p class="line number36 index35 alt1">36</p>




</td>
<td class="code">
<div class="container">
<p class="line number1 index0 alt2"><code class="php plain">&lt;?php&nbsp; </code></p>
<p class="line number2 index1 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">class</code> <code class="php plain">ConnecToDB&nbsp; </code></p>
<p class="line number3 index2 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">{&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number4 index3 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">private</code> <code class="php keyword">static</code> <code class="php variable">$instance</code><code class="php plain">=</code><code class="php keyword">array</code><code class="php plain">();&nbsp; </code></p>
<p class="line number5 index4 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php comments">//防止外部创建新的数据库连接类&nbsp; </code></p>
<p class="line number6 index5 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">private</code> <code class="php keyword">function</code> <code class="php plain">_constuct(){}&nbsp; </code></p>
<p class="line number7 index6 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">static</code> <code class="php keyword">public</code> <code class="php keyword">function</code> <code class="php plain">Connect()&nbsp; </code></p>
<p class="line number8 index7 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number9 index8 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php comments">//连接类不够100,创建新类&nbsp; </code></p>
<p class="line number10 index9 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">if</code><code class="php plain">(</code><code class="php functions">count</code><code class="php plain">(self::</code><code class="php variable">$instance</code><code class="php plain">)&lt;100)&nbsp; </code></p>
<p class="line number11 index10 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">{&nbsp; </code></p>
<p class="line number12 index11 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$newDb</code><code class="php plain">=</code><code class="php keyword">new</code> <code class="php plain">self();&nbsp; </code></p>
<p class="line number13 index12 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">self::</code><code class="php variable">$instance</code><code class="php plain">[]=</code><code class="php variable">$newDb</code><code class="php plain">;&nbsp; </code></p>
<p class="line number14 index13 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">return</code> <code class="php variable">$newDb</code><code class="php plain">::ConDB();&nbsp; </code></p>
<p class="line number15 index14 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}&nbsp; </code></p>
<p class="line number16 index15 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">else</code>&nbsp;</p>
<p class="line number17 index16 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number18 index17 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php comments">//随机数保证数据库连接均衡&nbsp; </code></p>
<p class="line number19 index18 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$i</code><code class="php plain">=rand(0,99);&nbsp; </code></p>
<p class="line number20 index19 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$new_obj</code><code class="php plain">=self::</code><code class="php variable">$instance</code><code class="php plain">[</code><code class="php variable">$i</code><code class="php plain">];&nbsp; </code></p>
<p class="line number21 index20 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">return</code> <code class="php variable">$new_obj</code><code class="php plain">::ConDB();&nbsp; </code></p>
<p class="line number22 index21 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}&nbsp; </code></p>
<p class="line number23 index22 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}&nbsp; </code></p>
<p class="line number24 index23 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">static</code> <code class="php keyword">private</code> <code class="php keyword">function</code> <code class="php plain">ConDB()&nbsp; </code></p>
<p class="line number25 index24 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">{&nbsp; </code></p>
<p class="line number26 index25 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">try</code>&nbsp;</p>
<p class="line number27 index26 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">{&nbsp; </code></p>
<p class="line number28 index27 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$connec</code><code class="php plain">=mysql_connect(</code><code class="php string">"127.0.0.1"</code><code class="php plain">,</code><code class="php string">"数据库账户"</code><code class="php plain">,</code><code class="php string">"数据库密码"</code><code class="php plain">);&nbsp; </code></p>
<p class="line number29 index28 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">mysql_select_db(</code><code class="php string">"数据库名"</code><code class="php plain">);</code><code class="php comments">//选择数据库&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number30 index29 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</p>
<p class="line number31 index30 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}&nbsp; </code></p>
<p class="line number32 index31 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">catch</code><code class="php plain">(Exception </code><code class="php variable">$e</code><code class="php plain">)&nbsp; </code></p>
<p class="line number33 index32 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">{&nbsp; </code></p>
<p class="line number34 index33 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$errors</code><code class="php plain">[]=</code><code class="php variable">$e</code><code class="php plain">-&gt;getMessage();&nbsp; </code></p>
<p class="line number35 index34 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}</code></p>
<p class="line number36 index35 alt1"><code class="php plain">}</code></p>




</div>




</td>




</tr>




</tbody>




</table>




</li>




</ol>
<p>连接池的作用主要是节省打开数据库的时间。连接池机制预先打开N个数据库连接,把它们缓存起来,当需要使用数据库的时候就直接使用这些已经打开的连接,从而节省了时间。连接池的存在基本上消除了数据库连接断开的时间与cpu开销。&nbsp;<br>连接池解决方案:<br>1、pconnect(持久连接):pconnect的原理,和连接池差不多的,都是程序关闭连接,但PHP并不真正关闭,再次打开时,直接使用可用的连接。<br>如果因为访问量太大出现Mysql应该配置 Mysql 数据库服务的my.cnf 里的 max_connection 的值,如max_connections = 2000。<br>2、mysql proxy。<br>3、memcache:针对mysql的一个数据库缓存实现。<br>4、SQL Relay:一个开源的数据库池连接代理服务器。支持Oracle、MySQL、mSQL、PostgreSQL、Sybase、MS SQL Server、IBM DB2、Sybase、SQLite、Lago、 ODBC、MS Access等。<br>安装与配置(http://blog.sina.com.cn/s/blog_4dd475390100hbck.html),安装SQL Relay需要先安装Rudiments:<br>1、安装Rudiments:<br># tar vxzf rudiments-0.28.2.tar.gz<br># cd rudiments-0.28.2<br># ./configure --prefix=/usr/local/rudiments<br># make<br># make install<br>2、安装SQL Relay:<br># tar vxzf sqlrelay-0.36.4.tar.gz<br># cd sqlrelay-0.36.4<br># ./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安装路径<br># make<br># make install<br>3、 设置PHP:修改 php.ini中extension_dir = "./",把以上内容修改为:extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922"。<br>根据PHP安装的路径来修改,并不是每个版本的PHP都是这个路径,在php.ini中添加如下内容extension=sql_relay.so。<br>4、修改SQL Relay的配置文件<br># cd /usr/local/sqlrelay/etc<br># cp sqlrelay.conf.example sqlrelay.conf<br>把sqlrelay.conf的内容改为:</p>
<table class="syntaxhighlighterphp" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<p class="line number1 index0 alt2">1</p>
<p class="line number2 index1 alt1">2</p>
<p class="line number3 index2 alt2">3</p>
<p class="line number4 index3 alt1">4</p>
<p class="line number5 index4 alt2">5</p>
<p class="line number6 index5 alt1">6</p>
<p class="line number7 index6 alt2">7</p>
<p class="line number8 index7 alt1">8</p>
<p class="line number9 index8 alt2">9</p>
<p class="line number10 index9 alt1">10</p>
<p class="line number11 index10 alt2">11</p>
<p class="line number12 index11 alt1">12</p>





</td>
<td class="code">
<div class="container">
<p class="line number1 index0 alt2"><code class="php plain">&lt;?xml version=</code><code class="php string">"1.0"</code><code class="php plain">?&gt;</code></p>
<p class="line number2 index1 alt1"><code class="php plain">&lt;!DOCTYPE instances SYSTEM </code><code class="php string">"sqlrelay.dtd"</code><code class="php plain">&gt;</code></p>
<p class="line number3 index2 alt2"><code class="php plain">&lt;instances&gt;</code></p>
<p class="line number4 index3 alt1"><code class="php plain">&lt;instance id=</code><code class="php string">"msdetest"</code> <code class="php plain">port=</code><code class="php string">"9000"</code> <code class="php plain">socket=</code><code class="php string">"/tmp/msdetest.socket"</code> <code class="php plain">dbase=</code><code class="php string">"freetds"</code> <code class="php plain">connections=</code><code class="php string">"5"</code> <code class="php plain">maxconnections=</code><code class="php string">"10"</code> <code class="php plain">maxqueuelength=</code><code class="php string">"0"</code> <code class="php plain">growby=</code><code class="php string">"1"</code> <code class="php plain">ttl=</code><code class="php string">"60"</code> <code class="php plain">endofsession=</code><code class="php string">"commit"</code> <code class="php plain">sessiontimeout=</code><code class="php string">"5"</code> <code class="php plain">runasuser=</code><code class="php string">"nobody"</code> <code class="php plain">runasgroup=</code><code class="php string">"nobody"</code> <code class="php plain">cursors=</code><code class="php string">"5"</code> <code class="php plain">authtier=</code><code class="php string">"listener"</code> <code class="php plain">handoff=</code><code class="php string">"pass"</code><code class="php plain">&gt;</code></p>
<p class="line number5 index4 alt2"><code class="php plain">&lt;users&gt;</code></p>
<p class="line number6 index5 alt1"><code class="php plain">&lt;user user=</code><code class="php string">"sa"</code> <code class="php plain">password=</code><code class="php string">"sa"</code><code class="php plain">/&gt;</code></p>
<p class="line number7 index6 alt2"><code class="php plain">&lt;/users&gt;</code></p>
<p class="line number8 index7 alt1"><code class="php plain">&lt;connections&gt;</code></p>
<p class="line number9 index8 alt2"><code class="php plain">&lt;connection connectionid=</code><code class="php string">"msdetest"</code> <code class="php plain">string=</code><code class="php string">"server=msde;db=pubs;user=sa;password=sa;"</code> <code class="php plain">metric=</code><code class="php string">"1"</code><code class="php plain">/&gt;</code></p>
<p class="line number10 index9 alt1"><code class="php plain">&lt;/connections&gt;</code></p>
<p class="line number11 index10 alt2"><code class="php plain">&lt;/instance&gt;</code></p>
<p class="line number12 index11 alt1"><code class="php plain">&lt;/instances&gt;</code></p>





</div>





</td>





</tr>





</tbody>





</table>
<p>启动SQL Relay,并测试;<br>1、启动 SQL Relay<br># export PATH=$PATH:/usr/local/sqlrelay/bin<br># sqlr-start -id msdetest<br>2、使用SQL工具:<br># sqlrsh -id msdetest<br>可以直接输入SQL语句停止SQL Relay:# sqlr-stop msdetest<br>3、测试PHP,写一个PHP文 件,内容如下:</p>
<table class="syntaxhighlighterphp" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<p class="line number1 index0 alt2">1</p>
<p class="line number2 index1 alt1">2</p>
<p class="line number3 index2 alt2">3</p>
<p class="line number4 index3 alt1">4</p>
<p class="line number5 index4 alt2">5</p>
<p class="line number6 index5 alt1">6</p>
<p class="line number7 index6 alt2">7</p>
<p class="line number8 index7 alt1">8</p>
<p class="line number9 index8 alt2">9</p>
<p class="line number10 index9 alt1">10</p>
<p class="line number11 index10 alt2">11</p>
<p class="line number12 index11 alt1">12</p>
<p class="line number13 index12 alt2">13</p>
<p class="line number14 index13 alt1">14</p>





</td>
<td class="code">
<div class="container">
<p class="line number1 index0 alt2"><code class="php plain">&lt;?</code></p>
<p class="line number2 index1 alt1"><code class="php variable">$con</code><code class="php plain">=sqlrcon_alloc(</code><code class="php string">"msdetest"</code><code class="php plain">,9000,</code><code class="php string">"/tmp/msdetest.socket"</code><code class="php plain">,</code><code class="php string">"sa"</code><code class="php plain">,</code><code class="php string">"sa"</code><code class="php plain">,0,1);</code></p>
<p class="line number3 index2 alt2"><code class="php variable">$cur</code><code class="php plain">=sqlrcur_alloc(</code><code class="php variable">$con</code><code class="php plain">);</code></p>
<p class="line number4 index3 alt1"><code class="php plain">sqlrcur_sendQuery(</code><code class="php variable">$cur</code><code class="php plain">,</code><code class="php string">"select * from t_gifts"</code><code class="php plain">);</code></p>
<p class="line number5 index4 alt2"><code class="php keyword">for</code> <code class="php plain">(</code><code class="php variable">$row</code><code class="php plain">=0; </code><code class="php variable">$row</code><code class="php plain">&lt;sqlrcur_rowCount(</code><code class="php variable">$cur</code><code class="php plain">); </code><code class="php variable">$row</code><code class="php plain">++) {</code></p>
<p class="line number6 index5 alt1"><code class="php keyword">for</code> <code class="php plain">(</code><code class="php variable">$col</code><code class="php plain">=0; </code><code class="php variable">$col</code><code class="php plain">&lt;sqlrcur_colCount(</code><code class="php variable">$cur</code><code class="php plain">); </code><code class="php variable">$col</code><code class="php plain">++) {</code></p>
<p class="line number7 index6 alt2"><code class="php functions">echo</code> <code class="php plain">sqlrcur_getField(</code><code class="php variable">$cur</code><code class="php plain">,</code><code class="php variable">$row</code><code class="php plain">,</code><code class="php variable">$col</code><code class="php plain">);</code></p>
<p class="line number8 index7 alt1"><code class="php functions">echo</code> <code class="php string">","</code><code class="php plain">;</code></p>
<p class="line number9 index8 alt2"><code class="php plain">}</code></p>
<p class="line number10 index9 alt1"><code class="php functions">echo</code> <code class="php string">"&lt;br&gt;\n"</code><code class="php plain">;</code></p>
<p class="line number11 index10 alt2"><code class="php plain">}</code></p>
<p class="line number12 index11 alt1"><code class="php plain">sqlrcur_free(</code><code class="php variable">$cur</code><code class="php plain">);</code></p>
<p class="line number13 index12 alt2"><code class="php plain">sqlrcon_free(</code><code class="php variable">$con</code><code class="php plain">);</code></p>
<p class="line number14 index13 alt1"><code class="php plain">?&gt;</code></p>





</div>





</td>





</tr>





</tbody>





</table>
<p><br>php+sqlrelay+mysql实现连接池及读写负载均衡:<br>为了有效的解决并发访问的瓶颈,利用多台数据库master-slave的模式来增加web的并发访问量。master-slave模式是为了数据同步的问题。<br>sqlrelay 解决连接池问题以及实现读写分离的均衡负载。sqlrelay配置3个instance A/B/C,A负责从Master和slave读取数据,B负责写数据,且只写Master,C为router负责调度应用。php通过A还是通过B连接 数据库。在实际配置中,由于master承担了读写操作,那么在instance A的配置中,可以把从Master的连接稍微降小,把从slave连接读取数据的连接数稍稍增大以此进行平衡。<br>配置与应用(http://blog.163.com/lgh_2002/blog/static/4401752620107393057989/):</p>
<p>一、MySQL master/slave配置<br>################<br>#mster/slave配置<br>################<br>master:192.168.1.51<br>slave:192.168.1.50<br>1、master配置<br>/etc/my.cnf 中加入<br>binlog-do-db=book book为数据库名确保<br>server-id=1<br>log-bin=mysql-bin<br>授权给rep用户进行复制操作<br>GRANT REPLICATION SLAVE ON book.* TO rep@192.168.1.50 IDENTIFIED BY '123456';<br>重启master服务<br>2、配置slave<br>vi /etc/my.cnf<br>设置下面4行<br>server-id = 2<br>master-host = 192.168.1.51<br>master-user = rep<br>master-password = 123456<br>重启slave<br>3、把master的原始数据导入slave。</p>
<p><br>二、sqlrelay配置<br>当前行业中比较流行的连接池解决方案几乎都不支持php,经过多番努力终于在找到了一个开源的连接池技术--------sqlrelay。<br>sqlreplay支持的语言:C C++ Perl Python PHP Ruby Java TCL Zope。<br>sqlreplay支持的数据库:Oracle MySQL mSQL PostgreSQL Sybase MS SQL Server IBM DB2 Interbase Sybase SQLite ODBC MS Access<br>基本思路:<br>1、配置2个实例用以最终处理业务<br>clubs-read<br>clubi-write<br>其中读取的 instance分别配置两个连接,且两个连接启动对等的连接数。<br>2、配置一个instance来调度读写操作,即clubr<br>通过router来区分读写连接不同的mysql数据库。</p>
<table class="syntaxhighlighterphp" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<p class="line number1 index0 alt2">1</p>
<p class="line number2 index1 alt1">2</p>
<p class="line number3 index2 alt2">3</p>
<p class="line number4 index3 alt1">4</p>
<p class="line number5 index4 alt2">5</p>
<p class="line number6 index5 alt1">6</p>
<p class="line number7 index6 alt2">7</p>
<p class="line number8 index7 alt1">8</p>
<p class="line number9 index8 alt2">9</p>
<p class="line number10 index9 alt1">10</p>
<p class="line number11 index10 alt2">11</p>
<p class="line number12 index11 alt1">12</p>
<p class="line number13 index12 alt2">13</p>
<p class="line number14 index13 alt1">14</p>
<p class="line number15 index14 alt2">15</p>
<p class="line number16 index15 alt1">16</p>
<p class="line number17 index16 alt2">17</p>
<p class="line number18 index17 alt1">18</p>
<p class="line number19 index18 alt2">19</p>
<p class="line number20 index19 alt1">20</p>
<p class="line number21 index20 alt2">21</p>





</td>
<td class="code">
<div class="container">
<p class="line number1 index0 alt2"><code class="php plain">&lt;?xml version=</code><code class="php string">"1.0"</code><code class="php plain">?&gt;</code></p>
<p class="line number2 index1 alt1"><code class="php plain">&lt;!DOCTYPE instances SYSTEM </code><code class="php string">"sqlrelay.dtd"</code><code class="php plain">&gt;</code></p>
<p class="line number3 index2 alt2"><code class="php plain">&lt;instances&gt;</code></p>
<p class="line number4 index3 alt1"><code class="php plain">&lt;!-- club Instance --&gt;</code></p>
<p class="line number5 index4 alt2"><code class="php plain">&lt;instance id=</code><code class="php string">"clubs"</code> <code class="php plain">port=</code><code class="php string">"9002"</code> <code class="php plain">socket=</code><code class="php string">"/tmp/clubs.socket"</code> <code class="php plain">dbase=</code><code class="php string">"mysql"</code> <code class="php plain">connections=</code><code class="php string">"10"</code> <code class="php plain">maxconnections=</code><code class="php string">"20"</code> <code class="php plain">maxqueuelength=</code><code class="php string">"5"</code> <code class="php plain">growby=</code><code class="php string">"1"</code> <code class="php plain">ttl=</code><code class="php string">"60"</code> <code class="php plain">endofsession=</code><code class="php string">"commit"</code> <code class="php plain">sessiontimeout=</code><code class="php string">"600"</code> <code class="php plain">runasuser=</code><code class="php string">"nobody"</code> <code class="php plain">runasgroup=</code><code class="php string">"nobody"</code> <code class="php plain">cursors=</code><code class="php string">"5"</code> <code class="php plain">authtier=</code><code class="php string">"listener"</code> <code class="php plain">handoff=</code><code class="php string">"pass"</code> <code class="php plain">deniedips=</code><code class="php string">""</code> <code class="php plain">allowedips=</code><code class="php string">""</code> <code class="php plain">debug=</code><code class="php string">"none"</code> <code class="php plain">maxquerysize=</code><code class="php string">"65536"</code> <code class="php plain">maxstringbindvaluelength=</code><code class="php string">"4000"</code> <code class="php plain">maxlobbindvaluelength=</code><code class="php string">"71680"</code> <code class="php plain">idleclienttimeout=</code><code class="php string">"-1"</code> <code class="php plain">maxlisteners=</code><code class="php string">"-1"</code> <code class="php plain">listenertimeout=</code><code class="php string">"0"</code><code class="php plain">&gt;</code></p>
<p class="line number6 index5 alt1"><code class="php plain">&lt;users&gt;</code></p>
<p class="line number7 index6 alt2"><code class="php plain">&lt;user user=</code><code class="php string">"club"</code> <code class="php plain">password=</code><code class="php string">"edb:club"</code><code class="php plain">/&gt;</code></p>
<p class="line number8 index7 alt1"><code class="php plain">&lt;/users&gt;</code></p>
<p class="line number9 index8 alt2"><code class="php plain">&lt;connections&gt;</code></p>
<p class="line number10 index9 alt1"><code class="php plain">&lt;connection connectionid=</code><code class="php string">"master51"</code> <code class="php plain">string=</code><code class="php string">"host=192.168.1.51;port=3306;db=book;user=club;password=club;"</code> <code class="php plain">metric=</code><code class="php string">"1"</code> <code class="php plain">behindloadbalancer=</code><code class="php string">"no"</code><code class="php plain">/&gt;</code></p>
<p class="line number11 index10 alt2"><code class="php plain">&lt;connection connectionid=</code><code class="php string">"slave50"</code> <code class="php plain">string=</code><code class="php string">"host=192.168.1.50;port=3306;db=book;user=club;password=club;"</code> <code class="php plain">metric=</code><code class="php string">"1"</code> <code class="php plain">behindloadbalancer=</code><code class="php string">"no"</code><code class="php plain">/&gt;</code></p>
<p class="line number12 index11 alt1"><code class="php plain">&lt;/connections&gt;</code></p>
<p class="line number13 index12 alt2"><code class="php plain">&lt;/instance&gt;</code></p>
<p class="line number14 index13 alt1"><code class="php plain">&lt;instance id=</code><code class="php string">"clubi"</code> <code class="php plain">port=</code><code class="php string">"9003"</code> <code class="php plain">socket=</code><code class="php string">"/tmp/clubi.socket"</code> <code class="php plain">dbase=</code><code class="php string">"mysql"</code> <code class="php plain">connections=</code><code class="php string">"10"</code> <code class="php plain">maxconnections=</code><code class="php string">"40"</code> <code class="php plain">maxqueuelength=</code><code class="php string">"5"</code> <code class="php plain">growby=</code><code class="php string">"1"</code> <code class="php plain">ttl=</code><code class="php string">"60"</code> <code class="php plain">endofsession=</code><code class="php string">"commit"</code> <code class="php plain">sessiontimeout=</code><code class="php string">"600"</code> <code class="php plain">runasuser=</code><code class="php string">"nobody"</code> <code class="php plain">runasgroup=</code><code class="php string">"nobody"</code> <code class="php plain">cursors=</code><code class="php string">"5"</code> <code class="php plain">authtier=</code><code class="php string">"listener"</code> <code class="php plain">handoff=</code><code class="php string">"pass"</code> <code class="php plain">deniedips=</code><code class="php string">""</code> <code class="php plain">allowedips=</code><code class="php string">""</code> <code class="php plain">debug=</code><code class="php string">"none"</code> <code class="php plain">maxquerysize=</code><code class="php string">"65536"</code> <code class="php plain">maxstringbindvaluelength=</code><code class="php string">"4000"</code> <code class="php plain">maxlobbindvaluelength=</code><code class="php string">"71680"</code> <code class="php plain">idleclienttimeout=</code><code class="php string">"-1"</code> <code class="php plain">maxlisteners=</code><code class="php string">"-1"</code> <code class="php plain">listenertimeout=</code><code class="php string">"0"</code><code class="php plain">&gt;</code></p>
<p class="line number15 index14 alt2"><code class="php plain">&lt;users&gt;</code></p>
<p class="line number16 index15 alt1"><code class="php plain">&lt;user user=</code><code class="php string">"club"</code> <code class="php plain">password=</code><code class="php string">"edb:club"</code><code class="php plain">/&gt;</code></p>
<p class="line number17 index16 alt2"><code class="php plain">&lt;/users&gt;</code></p>
<p class="line number18 index17 alt1"><code class="php plain">&lt;connections&gt;</code></p>
<p class="line number19 index18 alt2"><code class="php plain">&lt;connection connectionid=</code><code class="php string">"master51"</code> <code class="php plain">string=</code><code class="php string">"host=192.168.1.51;port=3306;db=book;user=club;password=club;"</code> <code class="php plain">metric=</code><code class="php string">"1"</code> <code class="php plain">behindloadbalancer=</code><code class="php string">"no"</code><code class="php plain">/&gt;</code></p>
<p class="line number20 index19 alt1"><code class="php plain">&lt;/connections&gt;</code></p>
<p class="line number21 index20 alt2"><code class="php plain">&lt;/instance&gt;</code></p>





</div>





</td>





</tr>





</tbody>





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

</div>
<div id="MySignature" role="contentinfo">
    <div id="fry_added_part">
    <div class="fry_website">
      <div class="fry_website" style="color:#3c8dbc;padding: 10px 0;display:none;">
            我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站:
            【读书编程笔记】fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
      </div>
      <div class="copyright" style="color: red;padding-bottom: 10px;">
            版权申明:欢迎转载,但请注明出处
            <div style="font-size: 12px">一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。</div>
      </div>
      <div id="fry_know_friends" style="color: red;padding-bottom: 10px;font-size: 22px;">
            <div style="display:none;"></div>
            <div style="display:none;">在校每年国奖、每年专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。</div>
            <div style="display:none;">2025-04-30:宅加太忙,特此在网上找女朋友,坐标上海,非诚勿扰,vx:fan404006308</div>
      </div>
      <div class="copyright" style="color: green;padding-bottom: 10px;">
            录播课资料github地址:https://github.com/fry404006308/fry_course_materials
      </div>
      <div style="display:none;"></div>
    </div>
    <div class="fry_tech_group" style="color: mediumpurple;">
      <div>
            AI交流资料群:753014672
      </div>
    </div>
    <div class="fry_recommend">
      <h2>作者相关推荐</h2>
      <div id="fry_recommend" style="padding-bottom: 40px">
      </div>
    </div>
    <style>
      #fry_added_part .inspiration_content{
            //max-height: 120px;
            overflow: auto;
            margin: 20px 0;
      }
      #fry_added_part .fry_inspiration .simple a{
            margin-right: 25px;
      }
    </style>
    <div style="display:none;" class="fry_inspiration">
      <div style="color: red;font-size: 20px;text-align: center;" class="title">
            感悟总结
      </div>
      <!--分为详细部分和简略部分-->
      <!--详细部分-->
      <div class="detail">
            <div class="url_set">
                <div style="display: none;" class="per_url" href="https://www.cnblogs.com/Renyi-Fan/p/13498246.html"></div>
                <!--<div style="display: none;" class="per_url" href="https://www.cnblogs.com/Renyi-Fan/p/14379366.html"></div>-->
                <!--<div style="display: none;" class="per_url" href="https://www.cnblogs.com/Renyi-Fan/p/14154624.html"></div>-->
            </div>
            <div class="content_set"></div>
      </div>
      <!--简略部分-->
      <div style="display: none;" class="simple">
            <div style="color: #FF9966;margin-bottom: 10px;">其它重要感悟总结</div>
            <div>
                感悟总结200813
                最近心境200830
                最近心境201019
                201218-210205
            </div>
      </div>
    </div>
</div><br><br>
来源:https://www.cnblogs.com/Renyi-Fan/p/10913473.html
頁: [1]
查看完整版本: php 如何实现 数据库 连接池