关于php连接mysql数据库

    一直以来,都觉得php连接mysql是理所当然的,除了一开始学习php的那一周,手动写过类似mysql_connect的源码后,后来的项目都是使用了Zend,CI等框架来完成,就mysql连接这方面的技术来说,根本就没有关心过,因为,框架处理的很好。
    然而,灾难就是这样发生了,一个小项目, 逻辑很简单,但是瞬时并发有点小高(其实也不是特别的高),在一个单机的环境中,几乎就打不开首页了。因为用的是阿里云,最直接的方案就是加服务器,前面用负载,一台一台往上加应用服务器,最高加到了8台,结果呢,mysql数据库连接数严重不足,结果可想而知。shi了
    痛定思痛,重新回头学习了一些相关的知识。

php 连接 mysql 是分为两步走的
第一步:建立 php 到 mysql 服务器的 tcp/ip 通道 物理通道
第二步:登录 mysql 服务器,建立到数据库的通道 逻辑通道

无论是长连接还是短连接,php 程序都会关闭逻辑通道
短连接会同时关闭物理通道
而长连接会将物理通道保存起来,以备再次使用

从设计上来说,长连接减少了建立物理通道的时间,效率上说有会大大提高,但是,实际情况还是要视具体的的环境而定

php的pconnect 和 connect的区别
php中mysql_pconnect()的实现方式,其实mysql_pconnect()本身并没有做太多的处理,它唯一做的只是在php运行结束后不主动close掉mysql的连接。

    cgi方式下:在php经cgi方式运行时pconnect和connect是基本没有区别的,因为cgi方式是每一个php访问起一个进程,访问结束后进程也就结束了,资源也全释放了。

    主要区别在于当php以apache模块方式运行时, 由于apache有使用进程池, 一个httpd进程结束后会被放回进程池, 这也就使得用pconnect打开的的那个mysql连接资源不被释放, 于是
有下一个连接请求时就可以被复用.

从以上描述可以看出,php中mysql_pconnect()的实现首先是受到apache的影响的
对于做为apache模块运行的php来说,要实现mysql持久化连接,首先得取决于apache这个web服务器是否支持Keep-Alive。
在httpd.conf里找到KeepAive配置项,果断设置为On,MaxKeepAliveRequests果断为0(一个持久tcp最多允许的请求数,如果过小,很容易在tcp未过期的情况下,达到最大连接,那下次连接就又是新的tcp连接了,这里设置0表示不限制)

其次,mysql_pconnect()的实现受到mysql的wait_timeout和interactive_timeout

题外话:my.cnf中wait_timeout和interactive_timeout区别 wait_timeout — 指的是mysql在关闭一个非交互的连接之前所要等待的秒数,其取值范围为1-2147483(Windows),1-31536000(linux),默认值28800。 interactive_time — 指的是mysql在关闭一个交互的连接之前所要等待的秒数(交互连接如mysql gui tool中的连接),其取值范围随wait_timeout变动,默认值28800。 比如我们在终端上进入mysql管理,使用的即使交互的连接,这时候,如果没有操作的时间草果了interactive_time设置的时间就会自 动断开。当然我们可以在mysql_real_connect()中使用CLIENT_INTERACTIVE来设置位交互连接模式。 如果你的mysql已经在生产环境运行,那我们可以进入mysql终端查看timeout的设置,命令如下:”show global variables like ‘%timeout%’;” 这时候如果要修改timeout的值又不希望重启数据库服务器,那可以使用set global wait_timeout = 200;来修改,记得global哦,这是对mysql运行时全局变量的修改,如果没有global,则修改的变量只是当前这次开启的会话的而已            


所以,从用户的浏览器 到 web服务器 到 mysql 数据库,这一条链上的两个节点间的链接都直接影响到一个mysql数据库库长连接的结果。

如果web服务器支持长连接且浏览器到web服务器的连接较少,即并发量较少,此时的mysql的长连接是一个好的选择。但如果并发量很高,再使用mysql的长链接,而且正好wait_timeout又是系统默认值,那么mysql支持的连接数将很快被用完,且短时间内不会被释放,结果就是必死。

你可能感兴趣的:(关于php连接mysql数据库)