PHP串連池的問題____PHP
來源:互聯網
上載者:User
PHP串連池的問題 & 負載平衡 PHP串連池的問題 :
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:一個開源的資料庫池串連Proxy 伺服器。支援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工具: