在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解的朋友可参考.
PHP mysql_pconnect
mysql_pconnect() 函数打开一个到 MySQL 服务器的持久连接.
mysql_pconnect() 和 mysql_connect() 非常相似,但有两个主要区别.
1.当连接的时候本函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。
2.其次,当脚本执行完毕后到 SQL 服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close() 不会关闭由 mysql_pconnect() 建立的连接)。
语法:mysql_pconnect(server,user,pwd,clientflag)
参数 描述
server 可选。规定要连接的服务器。
可以包括端口号,例如 "hostname:port",或者到本地套接字的路径,例如对于 localhost 的 ":/path/to/socket".
如果 PHP 指令 mysql.default_host 未定义(默认情况),则默认值是 'localhost:3306'.
user 可选,用户名,默认值是服务器进程所有者的用户名.
pwd 可选,密码,默认值是空密码.
clientflag 可选,client_flags 参数可以是以下常量的组合:
•MYSQL_CLIENT_SSL - 使用 SSL 加密
•MYSQL_CLIENT_COMPRESS - 使用压缩协议
•MYSQL_CLIENT_IGNORE_SPACE - 允许函数名后的间隔
•MYSQL_CLIENT_INTERACTIVE - 允许关闭连接之前的交互超时非活动时间
返回值,如果成功,则返回一个 MySQL 持久连接标识符,出错则返回 FALSE.
提示和注释
注释:可选参数 clientflag 自 PHP 4.3.0 版起可用.
提示:要创建一个非持久连接,请使用 mysql_connect() 函数.
例子,代码如下:
- <?php
- $con = mysql_pconnect("localhost","mysql_user","mysql_pwd");
- if (!$con)
- {
- die('Could not connect: ' . mysql_error());
- }
- ?>
PHP mysql_connect
mysql_connect() 函数打开非持久的 MySQL 连接.
语法:mysql_connect(server,user,pwd,newlink,clientflag)
参数 描述
server 可选,规定要连接的服务器.
可以包括端口号,例如 "hostname:port",或者到本地套接字的路径,例如对于 localhost 的 ":/path/to/socket"。
如果 PHP 指令 mysql.default_host 未定义(默认情况),则默认值是 'localhost:3306'.
user 可选,用户名,默认值是服务器进程所有者的用户名.
pwd 可选,密码,默认值是空密码.
newlink 可选,如果用同样的参数第二次调用 mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识,参数 new_link 改变此行为并使 mysql_connect() 总是打开新的连接,甚至当 mysql_connect() 曾在前面被用同样的参数调用过.
clientflag 可选。client_flags 参数可以是以下常量的组合:
•MYSQL_CLIENT_SSL - 使用 SSL 加密
•MYSQL_CLIENT_COMPRESS - 使用压缩协议
•MYSQL_CLIENT_IGNORE_SPACE - 允许函数名后的间隔
•MYSQL_CLIENT_INTERACTIVE - 允许关闭连接之前的交互超时非活动时间
返回值:如果成功,则返回一个 MySQL 连接标识,失败则返回 FALSE.
提示和注释
注释:脚本一结束,到服务器的连接就被关闭,除非之前已经明确调用 mysql_close() 关闭了.
提示:要创建一个持久连接,请使用 mysql_pconnect() 函数.
例子,代码如下:
- <?php
- $con = mysql_connect("localhost","mysql_user","mysql_pwd");
- if (!$con)
- {
- die('Could not connect: ' . mysql_error());
- }
-
- mysql_close($con);
- ?>
mysql_connect与mysql_pconnect的区别
这俩函数用法上差不久不多,网上有说应当用pconnect的,pconnect是个好器材,也有视pconnect如洪水猛兽的,果断不让用pconnect的,也有立场模糊不清的,那这个器材到底如何呢?
永远链接并不是说,办事器打开了一个连接,然后所有的人都共享这个链接,永远连接一样是每个客户端来就打开一个连接,有200人接见就有200个连接,其实mysql_pconnect()本身并没有做太多的处理惩罚,它独一做的只是在php运行停止后不主动close掉mysql的连接.
在php经cgi体式格式运行时pconnect和connect是根蒂根基没有区此外,因为cgi体式格式是每一个php接见起一个过程,接见停止掉队程也就停止了,资料也全开释了.
当php以apache模块体式格式运行时,因为apache有应用过程池,一个httpd过程停止后会被放回过程池,这也就使得用pconnect打开的的那个mysql连接资料不被开释,于是有下一个连接恳求时就可以被复用.这就使得在apache并发接见量不大的时辰,因为应用了pconnect,php节俭了反复连接db的时候,使得接见速度加快.
这应当是斗劲好懂得的,然则在apache并发接见量大的时辰,若是应用pconnect,会因为之前的一些httpd过程占用的mysql连接没有close,则可能会因为mysql已经达到最大连接着,使得之后的一些恳求永远得不到满足.若mysql最大连接数设为500,而apache的最大同时接见数设为2000,假设所有接见都邑请求接见db,并且操纵时候会斗劲长,当前500个恳求的httpd都没有停止的时辰,之后的httd过程都是无法连接到mysql的(因已经达到mysql最大连接 数),只有当前500个httpd过程停止或被复用才可以连接获得了mysql.
当db操纵错杂,耗时较长时,因httpd会fork很多并发过程处理惩罚,而先产生的httpd过程不开释db连接,使得后产生的httpd过程无法连上db. 因为如许没有复用其它httpd过程的mysql连接,于是会就产生很多连接超时,在并发接见量不高时,应用pconnect可以简单进步接见速度,但在并发量增大后,是否再应用pconnect就要见地度员的选择了.
就我小我认为,php如今对mysql的连接并没有真正用到连接池,pconnect也只是相当于借了apache的过程池来用,所以在并发接见量大的时辰pconnect并不克不及很好的进步接见db效力.
在实际的应用中,用mysql_pconnect的话,每次刷新和恳求新的页面都斗劲快,而用mysql_connect的话,每次刷新都要从头恳求,当数据库连接斗劲慢的时辰,就能看出差别了。当你的数据库连接斗劲慢,DB操纵不是很错杂,并且你的法度足够自负,不会产存亡锁的时辰,或者你拥有对办事器的把握权,满足以上四个前提中的随便率性两个,那就可以用pconnect.
pconnect不消在脚本里封闭,可以在mysql中设置lifetime,也可以写shell按期扫描,kill掉休眠过长的连接,一句话总结:要用好pconnect,不仅仅是php脚本的事,还关系到数据库和办事器的设置. |