ホームページ  >  記事  >  バックエンド開発  >  PHPコネクションプールの詳しい説明

PHPコネクションプールの詳しい説明

小云云
小云云オリジナル
2018-03-27 13:37:4310998ブラウズ

PHP スクリプトは解釈と実行後にすべてのメモリ リソースを解放するため、PHP スクリプト自体を接続プールとして使用することはできません。もちろん、その中で使用されているデータベース接続も解放されますが、一部のミドルウェアは接続プールとして使用することもできます。 PHP 用の関連ドライバーが提供されている限り、独自の PHP 接続プールを作成できますが、100% 純粋な PHP 接続プールを作成することはできません。 mysql_pconnect は PHP に組み込まれたシミュレートされた接続プールですが、このメカニズムは PHP スクリプトを使用して実装されません。ただし、リンクは 1 回のリクエストで再利用できるため、新規作成による消費が削減されます。

  1. <?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プロキシ。
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 リレーの設定ファイルを変更します
# 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 リレーを開始します。テスト;

1. SQL Relay を開始します

# import PATH=$PATH:/usr/local/sqlrelay/bin
# sqlr-start -id msdetest
2. SQL ツールを使用します:
# sqlrsh -id msdetest
SQL 直接 SQL リレーを停止するステートメント: # 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 は接続プールと読み取り/書き込み負荷分散を実装します:

同時アクセスを効果的に解決するには ボトルネックを解決するには、複数のデータベースのマスター/スレーブ モードを使用して、同時 Web アクセス数を増やします。マスター/スレーブ モードはデータ同期用です。
sqlrelay は接続プールの問題を解決し、読み取りと書き込みの分離による負荷分散を実現します。 sqlrelay は 3 つのインスタンス A/B/C を構成します。A はマスターとスレーブからのデータの読み取りを担当し、B はデータの書き込みを担当し、マスターへの書き込みのみを担当します。C はアプリケーションのスケジュールを担当するルーターです。 PHP は A または B を介してデータベースに接続します。実際の構成では、マスターが読み取りと書き込みを担当するため、インスタンス A の構成では、マスターからの接続数が若干減り、スレーブ接続からデータを読み出すための接続数が若干少なくなります。バランスをとるために増加しました。
構成とアプリケーション (http://blog.163.com/lgh_2002/blog/static/4401752620107393057989/):

1. MySQL マスター/スレーブ構成

############### #

#mster/slave 構成
################
master:192.168.1.51
slave:192.168.1.50
1. マスター構成に追加
/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';
マスターサービスを再起動します
2. スレーブを設定します
vi /etc/my.cnf
次の4行を設定します
server-id = 2
master-host = 192.168.1.51
master-user = rep
master-password = 123456
スレーブ再起動
3. マスターの元データをスレーブにインポートします。


二、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。