没有合适的资源?快使用搜索试试~ 我知道了~
PHP数据库长连接mysql_pconnect的细节
0 下载量 124 浏览量
2020-12-14
22:51:15
上传
评论
收藏 94KB PDF 举报
温馨提示
试读
2页
PHP的MySQL持久化连接,美好的目标,却拥有糟糕的口碑,往往令人敬而远之。这到底是为啥么。近距离观察后发现,这家伙也不容易啊,要看Apache的脸色,还得听MySQL指挥。 对于作为Apache模块运行的PHP来说,要实现MySQL持久化连接,首先得取决于Apache这个web服务器是否支持Keep-Alive。 Keep-Alive Keep-Alive是什么东西?它是http协议的一部分,让我们复习一下没有Keep-Alive的http请求,从客户在浏览器输入一个有效url地址开始,浏览器会利用socket向url对应的web服务器发送一条TCP请求,这个请求成功一次
资源详情
资源评论
资源推荐
PHP数据库长连接数据库长连接mysql_pconnect的细节的细节
PHP的MySQL持久化连接,美好的目标,却拥有糟糕的口碑,往往令人敬而远之。这到底是为啥么。近距离观察后发现,
这家伙也不容易啊,要看Apache的脸色,还得听MySQL指挥。
对于作为Apache模块运行的PHP来说,要实现MySQL持久化连接,首先得取决于Apache这个web服务器是否支持Keep-
Alive。
Keep-Alive
Keep-Alive是什么东西?它是http协议的一部分,让我们复习一下没有Keep-Alive的http请求,从客户在浏览器输入一个
有效url地址开始,浏览器会利用socket向url对应的web服务器发送一条TCP请求,这个请求成功一次得需要来回握三次手才能
确定,成功以后,浏览器利用socket TCP连接资源向web服务器请求http协议,发送以后等着web服务器把http返回头和body
发送回来,发回来后浏览器关闭socket连接,然后做http返回头和body的解析工作,后呈现在浏览器上的是漂亮的页面了。这
里面有什么问题呢?TCP连接需要三次握手,也是来回请求三次方能确定一个TCP请求是否成功,然后TCP关闭呢?来回需要
4次请求才能完成!每次http请求3次握手,4次拜拜,这来来回回的不嫌累啊,多少时间和资源都被浪费在socket连接关闭上
了,能不能一次socket TCP连接发送多次http请求呢?于是Keep-Alive应运而生,http/1.0里需要客户端自己在请求头加入
Connection:Keep-alive方能实现,在这里我们只考虑http1.1了,只需要设置一下Apache,让它默认是Keep-Alive持久连接模
式(Apache必须1.2+才能支持Keep-Alive)。在httpd.conf里找到KeepAive配置项,果断设置为On,MaxKeepAliveRequests果
断为0(一个持久TCP多允许的请求数,如果过小,很容易在TCP未过期的情况下,达到大连接,那下次连接又是新的TCP连接
了,这里设置0表示不限制),然后对于mysql_pconnect重要的选项KeepAliveTimeout设置为15(表示15秒)。
好了,重启Apache,测试一下,赶紧写行东西:
1<?php
2 echo "Apache进程号:". getmypid();
3?>
很简单,获取当前PHP执行者(Apache)的进程号,用浏览器浏览这个页面,看到什么?对,有看到一串进程号数字,15
秒内,连续刷新页面,看看进程号有无变化?木有吧?现在把手拿开,交叉在胸前,度好时间,1秒,2秒,3,…15,16。
好,过了15秒了,再去刷新页面,进程号有没有变化?变了!又是一个新的Apache进程了,为什么15秒后变成新的进程了?
记得我们在Apache里设置的KeepAliveTimeout吗?它的值是15秒。现在我们应该大致清楚了,在web服务器默认打开
KeepAlive的情况下,客户端第一次http成功请求后,Apache不会立刻断开socket,而是一直监听来自这一客户端的请求,监
听多久?根据KeepAliveTimeout选项配置的时间决定,一旦超过这一时间,Apache会断开socket了,那么下次同一客户端再
次请求,Apache会新开一个进程来相应。所以我们之前15内不停的刷新页面,看到的进程号都是一致的,表明是浏览器请求
给了同一个Apache进程。
浏览器是怎么知道不需要重新进行TCP连接可以直接发送http请求呢?因为http返回头里会带上Connection:keep-
alive,Keep-alive:15两行,意思是让客户端浏览器明白,这次socket连接我这边还没关闭呢,你可以在15内继续使用这个连
接,并发送http请求,于是乎浏览器知道应该怎么做了。
PHP怎么做
那么,PHP的MySQL连接资源是怎么被hold住的呢,这需要查看PHP的mysql_pconnect的函数代码,我看了下,大概的
做法是mysql_pconnect根据当前Apache进程号,生成hash key,找hash表内有无对应的连接资源,没有则推入hash表,有则
直接使用。有些代码片段可以说明(具体可查看PHP5.3.8源码ext/mysql/PHP_mysql.c文件690行PHP_mysql_do_connect函数)
#1.生成hash key
user=php_get_current_user();//获取当前PHP执行者(Apache)的进程标识号
//hashed_details是hash key
hashed_details_length = spprintf(&hashed_details, 0, "MySQL__%s_", user);
#2.如果未找到已有资源,推入hash表,名字叫persistent_list,如果找到直接使用
/* try to find if we already have this link in our persistent list */
if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) {
/* we don't */
…
…
/* hash it up(推入hash表) */
Z_TYPE(new_le) = le_plink;
new_le.ptr = mysql;
if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le,
sizeof(zend_rsrc_list_entry), NULL)==FAILURE) {
…
…
}
}
else
{/* The link is in our list of persistent connections(连接已在hash表里)*/
…
…
mysql = (PHP_mysql_conn *) le->ptr;//直接使用对应的sql连接资源
…
…
}
zend_hash_find比较容易看明白,原型是zend_hash_find(hash表,key名,key长,value);如果找到,value有值了。
MySQL的wait_timeout和interactive_timeout
weixin_38669674
- 粉丝: 11
- 资源: 931
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 筷手引流工具.apk
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0