PHP 스크립트 자체는 해석 및 실행 후에 모든 메모리 리소스를 해제하기 때문에 연결 풀로 사용할 수 없습니다. 물론 여기에 사용된 데이터베이스 연결도 해제되지만 일부 미들웨어는 연결 풀로 사용할 수도 있습니다. 연결 풀. PHP용 관련 드라이버가 제공되는 한 자신만의 PHP 연결 풀을 만들 수 있지만 100% 순수한 PHP 연결 풀을 만들 수는 없습니다. mysql_pconnect는 PHP에 내장된 시뮬레이션된 연결 풀이지만 이 메커니즘은 PHP 스크립트를 사용하여 구현되지 않습니다. 그러나 한 번의 요청으로 링크를 재사용할 수 있으므로 새로운 요청으로 인한 소비가 줄어듭니다.
<?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. up PHP: php.ini에서 Extension_dir = "./"를 수정하고 위 내용을 다음과 같이 변경합니다.
PHP 설치 경로에 따라 수정하세요. 모든 PHP 버전에 이 경로가 있는 것은 아닙니다. php.ini에 다음 콘텐츠 확장자=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 시작
# import PATH=$PATH:/usr/local/sqlrelay/bin
# sqlr-start -id msdetest
2 SQL 도구 사용:
# sqlrsh -id msdetest
SQL Relay를 중지하는 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은 연결 풀 및 읽기-쓰기 로드 밸런싱을 구현합니다.
In 동시 접속을 효과적으로 해결하기 위해 병목 현상을 해결하려면 여러 데이터베이스의 마스터-슬레이브 모드를 사용하여 동시 웹 방문 수를 늘리십시오. 마스터-슬레이브 모드는 데이터 동기화를 위한 모드입니다.
sqlrelay는 연결 풀 문제를 해결하고 읽기 및 쓰기 분리의 로드 밸런싱을 달성합니다. sqlrelay는 세 개의 인스턴스 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 담당자 @192.168 .1.50 '123456'으로 식별됨;
마스터 서비스를 다시 시작합니다
2. 슬레이브를 구성합니다
vi /etc/my.cnf
다음 4줄을 설정합니다
server-id = 2
master-host = 192.168.1.51
master-user = 대표
master- 비밀번호 = 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!