文档章节

关于php连接mysql数据库

gx1727
 gx1727
发布于 2015/08/27 14:25
字数 1205
阅读 118
收藏 7
    一直以来,都觉得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支持的连接数将很快被用完,且短时间内不会被释放,结果就是必死。

© 著作权归作者所有

gx1727
粉丝 10
博文 52
码字总数 31968
作品 0
芜湖
高级程序员
私信 提问
PHP-MySQL连接问题

在使用PHP去连接MySQL数据库时,有三种(流行的)方法: PHP-MySQL, PHP-MySQLi, PDO, 有一些需要注意的地方: 1, 当我们谈论MySQL的时候,更多的是指关系型数据库; 2,PHP-MySQL和PHP-MySQLi是...

vinci321
2018/03/08
25
0
Zebra_Database 2.2 发布,PHP的MySQL扩展

Zebra_Database 是一个高级的、紧缩的(只包含单个文件)、轻量级的、面向对象的 MySQL 数据库访问封装器,基于 PHP 的 MySQL 扩展开发。提供了各种用于与 MySQL 数据库交互的直观方法,比 ...

红薯
2011/03/06
442
0
mysql_query的返回值

这些话提前说:我要学会php中所有关于mysql的函数,并且写出数据库操作类和框架 mysql_query: 返回值: mysql_query一般是用来给MYSQL递交一个SQL语句去执行的 布尔值 NULL ,false, 0 ," " ...

kobe52099
2018/06/29
0
0
WordPress定期出现“建立数据库连接时出错”问题的解决方案

先贴阿里云服务器的配置: 阿里云配置.png 这是一个困扰我很久的问题,之前不管是搭在CentOS还是Ubuntu上,Wordpress都会定期出现“建立数据库连接时错误”,最近一周更是每天早上网站都无法访...

testglory
2017/11/22
0
0
对付 MySQL 的死连接,Sleep的进程的来源探究[转]

对付 MySQL 的死连接,Sleep的进程的来源探究[转] 当前的连接数: mysql show status like '%Threadsconnected%'; +-------------------+-------+ | Variablename | Value | +--------------......

刘赤龙
2010/06/08
620
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
33分钟前
34
0
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
9
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部