php 腳本本身的確是不能做連接池的,因為php腳本在解釋執行完畢後會釋放所有記憶體資源,當然其中用到的資料庫連接也會被釋放,但一些中間件也是可以做為連接池的,只要提供php的相關驅動,所以可以自己做php的連接池,但絕對作不了100% pure php的連接池。 mysql_pconnect是php內建的一個類比連接池,但這套機制不是用php腳本實現的。 但是一次請求可以重複使用鏈接,減少new帶來的消耗。
<?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的內容改為:
<?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文件,內容如下:
<? $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設定
二、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数据库。
<?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連線池詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!