mysql_pconnect()和mysql_connect()

mysql_pconnect -- PHP打开一个到 MySQL 服务器的持久连接

通常情况下,使用pconnect代替connect,会带一定的性能提升,详情请参考我写的PHP-JPS性能不完全测试(http://www.eit.name/other/phpjsp.htm)
一直漂(ipaddr,bcomcn)原创,转载请注明

但使用Pconnect会经常的导致Mysql连接失败,提示连接太多,原因在于pconnect后,Apache不会自动关闭mysql的连接.
先来看看APACHE的工作模式
Windows 下,Apache使用一个主进程,加一个辅进程,再由辅进程派生N个线程的方式来提供服务,线程的数量可以在httpd.conf里配置: ThreadsPerChild 500,如果指定为500线程,则apache一启动时就会启动500个线程,但最多也只使用500个线程,如果同时连接数量超过500个(可能300个用户访问就有500个连接,判断当前连接的方法,可以使用netstat -na|grep 80|grep EST|wc -l或者使用apache的status module),那么,多余的连接将会在等待或者连接失败.(所以,Windows下Apache的主要配置参数应该是ThreadsPerChild, 先根据当前的连接数,再看看有没有必要调大一些,一般PC服务器设置为1000算是比较大了.)
Nix下,Apache使用进程的方式来运行,原理相同,需要调整进程数量的参数有几个,比如ServerLimit.

再来看看Apache+PHP+Mysql_pconnect的工作方式
每当客户端向服务端发送一个连接请求(包括图片,HTML,PHP等),apache将会用一个线程来接受这个请求,如果是请求的是一个PHP文件,且 PHP文件里使用了PConnect,则当前线程会判断当前线程有没有打开过pconnect,如果有打开过,则使用原来的mysql connect,如果没有打开过,则新建一个connect,并且,连接断开后,线程仍在运行,而且保持Mysql connect.按这种方式运行一段时间后,完全有可能所有apache的线程都打开过有Pconnect的Php页面,所以,如果apache的 ThreadsPerChild=500的话,则500个线程都找开了mysql连接,并且没有关闭,则就要求,mysql的连接数必须大于或等于 500,如果小于这个值,将会导致PHP页面提示数据库连接失败.

所以,得出结论,Apache+PHP+Mysql下使用 pconnect时,mysql的max_connect必须大于或等于apache的最大线程(进程)数.在一个访问量很大的站点,使用 pconnect可能不太现实,最好的办法是,尽可能的将数据库内容生成为静态文件,而不需要每个页面都连接数据库,并且使用mysql_connect (即使将绝大多数页面生成为静态文件,但仍有mysql_pconnect时,同样要求mysql的max_connect大于apache的线程数,所以这种情况下使用pconnect非常不可取).

----------------------------------------------------------------------------------------------

 

 

mysql_connect() 和 mysql_pconnect()
 
 
    连接mysql数据库,我们通用两种方式,mysql_connect()和mysql_pconnect(),前者的作用是每次连接都建立一个新连接,后者则是持续的连接。
    mysql_connect()会在每次调用当前php页面时建立一个或是多个新的连接,然后在请求结束后关闭这些连接。这种方式比较适合使用在不太繁重的页面中,不需要调整,直接在内部使用。
    mysql_pconnect()也会在页面被调用的时候新建一个连接,但是在请求结束后不会关闭连接,反而在把连接保存在连接池中,这样一个并发的请求还能继续使用这个连接。这种连接方式是提供给那些使用非常频繁的页面,不然资源会被频繁的开与关消耗掉,这样就对性能有严重的影响。
    mysql_pconnect()中的p,就是单词persistent(永久的)的首字母。
    mysql_pconnect()需要服务器的调整,也需要限制连接的数量,配置超时,以及什么时候处理空闲进程。他能让你在正确的环境中改善效率。

 

 

----------------------------------------------------------------------------------------------

 

永久的数据库连接是指在您的脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。

注意,如果永久连接的子过程数目超过了您设定的数据库连接数限制,系统将会产生一些缺陷。如果您的数据库的同时连接数限制为 16,而在繁忙会话的情况下,有 17 个线程试图连接,那么有一个线程将无法连接。如果这个时候,在您的脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16 个连接将迅速的受到影响。请查阅您使用的数据库的文档,以获取关于如何处理已放弃的及闲置的连接的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
if(!function_exists('mysql_pconnect')){ function mysql_pconnect($dbhost, $dbuser, $dbpass){ global $dbport; global $dbname; global $linkid; $linkid = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); return $linkid; } function mysql_select_db($dbname){ global $linkid; return mysqli_select_db($linkid,$dbname); } function mysql_fetch_array($result, $type=''){ if ($type) { return mysqli_fetch_array($result, $type); }else{ return mysqli_fetch_array($result); } } function mysql_fetch_assoc($result){ return mysqli_fetch_assoc($result); } function mysql_fetch_row($result){ return mysqli_fetch_row($result); } function mysql_free_result($result){ return mysqli_free_result($result); } function mysql_query($cxn){ global $linkid; return mysqli_query($linkid,$cxn); } function mysql_insert_id(){ global $linkid; return mysqli_insert_id($linkid); } function mysql_affected_rows(){ global $linkid; return mysqli_affected_rows($linkid); } function mysql_escape_string($data){ global $linkid; return mysqli_real_escape_string($linkid, $data); } function mysql_real_escape_string($data){ global $linkid; return mysqli_real_escape_string($linkid, $data); } function mysql_close(){ global $linkid; return mysqli_close($linkid); } function mysql_get_server_info(){ global $linkid; return mysqli_get_server_info($linkid); } function mysql_num_rows($result){ return mysqli_num_rows($result); } } error_reporting(E_ERROR | E_PARSE); error_reporting(E_ALL ^ E_WARNING); error_reporting(E_ALL & ~E_NOTICE); error_reporting(E_ALL ^ E_DEPRECATED);给代码加上注释
最新发布
06-06
以下是对代码的注释: ```php if(!function_exists('mysql_pconnect')){ // 自定义 mysql_pconnect 函数 function mysql_pconnect($dbhost, $dbuser, $dbpass){ // 全局变量 global $dbport; global $dbname; global $linkid; // 使用 mysqli_connect 连接数据库 $linkid = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); return $linkid; } // 自定义 mysql_select_db 函数 function mysql_select_db($dbname){ // 全局变量 global $linkid; // 使用 mysqli_select_db 选择数据库 return mysqli_select_db($linkid,$dbname); } // 自定义 mysql_fetch_array 函数 function mysql_fetch_array($result, $type=''){ // 如果传入 $type,则使用 mysqli_fetch_array 函数并返回 if ($type) { return mysqli_fetch_array($result, $type); } // 否则使用 mysqli_fetch_array 函数并返回 else{ return mysqli_fetch_array($result); } } // 自定义 mysql_fetch_assoc 函数 function mysql_fetch_assoc($result){ return mysqli_fetch_assoc($result); } // 自定义 mysql_fetch_row 函数 function mysql_fetch_row($result){ return mysqli_fetch_row($result); } // 自定义 mysql_free_result 函数 function mysql_free_result($result){ return mysqli_free_result($result); } // 自定义 mysql_query 函数 function mysql_query($cxn){ // 全局变量 global $linkid; // 使用 mysqli_query 函数查询数据库 return mysqli_query($linkid,$cxn); } // 自定义 mysql_insert_id 函数 function mysql_insert_id(){ // 全局变量 global $linkid; // 使用 mysqli_insert_id 函数获取最后插入的 ID return mysqli_insert_id($linkid); } // 自定义 mysql_affected_rows 函数 function mysql_affected_rows(){ // 全局变量 global $linkid; // 使用 mysqli_affected_rows 函数获取受影响的行数 return mysqli_affected_rows($linkid); } // 自定义 mysql_escape_string 函数 function mysql_escape_string($data){ // 全局变量 global $linkid; // 使用 mysqli_real_escape_string 函数转义字符串 return mysqli_real_escape_string($linkid, $data); } // 自定义 mysql_real_escape_string 函数 function mysql_real_escape_string($data){ // 全局变量 global $linkid; // 使用 mysqli_real_escape_string 函数转义字符串 return mysqli_real_escape_string($linkid, $data); } // 自定义 mysql_close 函数 function mysql_close(){ // 全局变量 global $linkid; // 使用 mysqli_close 函数关闭连接 return mysqli_close($linkid); } // 自定义 mysql_get_server_info 函数 function mysql_get_server_info(){ // 全局变量 global $linkid; // 使用 mysqli_get_server_info 函数获取 MySQL 服务器信息 return mysqli_get_server_info($linkid); } // 自定义 mysql_num_rows 函数 function mysql_num_rows($result){ // 使用 mysqli_num_rows 函数获取结果集中的行数 return mysqli_num_rows($result); } } // 设置错误报告级别 error_reporting(E_ERROR | E_PARSE); // 不显示警告和通知 error_reporting(E_ALL ^ E_WARNING); // 显示错误和通知,不显示警告 error_reporting(E_ALL & ~E_NOTICE); // 显示错误和警告,不显示通知 error_reporting(E_ALL ^ E_DEPRECATED); // 显示错误和通知,不显示弃用的函数警告 ``` 注释是用来解释代码的作用和意图,方便其他开发人员理解和维护代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值