测试PHP-FPM的工作流中的疑惑点
顺序比较乱,想到什么测试什么,测试环境 PHP7.2 和 MariaDB10.3.11
PHP-FPM是 master/worker 多进程模型
master负责和web-server通讯,把接受到请求分发到一个子进程(worker)处理
worker进程出现异常退出不会影响到master,master会重新启动一个新的子进程
2. 打开持久化的数据库连接:
$mysqli = new mysqli('p:host', 'user', 'password', 'dbname');
注意: 文档中说 持久化连接不能显示关闭,$mysqli->close() 无效,实测结果发现:$mysqli->close() 确实无法关闭数据库资源连接,
但是这句话后面的sql查询是无法执行的,但是不影响下一个php请求。
3. 打开非持久化的数据库连接
$mysqli = new mysqli('host', 'user', 'password', 'dbname');
如果使用持久化方式连接数据库,当子进程完成任务后不会立马关闭与数据库的连接,当下一个请求任务过来后会继续使用这个连接,
(这里持久化只是PHP不主动关闭连接,但不保证MySQL不主动断开,MySQL可以通过配置wait_timeout来主动关闭长时间没有活动的连接)
非持久连接方式会在任务处理完后立即关闭数据库连接
持久连接带来了一个直观的好处,性能提升,但也带来了很多不可预知的错误,比如上一个连接开启了事务但是没有提交,那后面连接上的操作
会出现问题
持久化连接的数据库句柄是保存在子进程的,如果有30个子进程都连接了数据库,那么这30个子进程都会保持和数据库的连接,
所以有个地方需要特别注意,MySQL的最大连接数一定要设置为大于PHP子进程最大数量,否则MySQL会出现 too many connections 错误
查看MySQL当前连接数(每隔一秒刷新一次)
mysqladmin -uroot -p123456 -i processlist 查看InnoDB的事务和锁
SHOW ENGINE INNODB STATUS;
4. 如果PHP子进程正常/意外退出,MySQL连接会不会自动释放?
不管子进程是正常退出(处理完请求)还是意外退出(直接kill掉),
也不管和数据库是长连接还是短链接,数据库都会自动断开
5. 如果浏览器发送一个复杂的请求,导致服务器返回超时,会发生什么?
这个要分两种情况:
Nginx超时:服务器返回504,这个时候PHP子进程不受影响继续执行,和数据库的连接也不会断开,最终任务会成功执行(前提是PHP不超时)
这种情况很糟糕,用户看到的是失败,后台却执行成功了,用户可能会反复重试多次,造成数据错乱。
PHP超时:服务器返回502,这个时候PHP子进程会被Master杀掉并重启一个子进程,所以任务是没有执行成功的,数据库资源也会自动断开
6. 如果子进程连接数据库并开启了事务,但是最后没有提交,会发生什么?
分两种情况:
数据库为非持久连接: 这种情况下数据库连接都关闭了,就别操心事务了
数据库持久连接:这个情况下官方的说法是要银熊后面的请求,但是实际测试发现,没有影响,如果实在担心的话,可以使用函数 register_shutdown_function
对每个请求结束前处理一下
register_shutdown_function(function() {
echo ("shutdown process");
});
7. 做一个实验:配置PHP-FPM只启动一个子进程,浏览器连续发送3个请求,PHP处理程序中sleep 25秒
观察现象:
通过top可以看到确实始终只有一个 PHP子进程
通过 mysqladmin 查看,始终只有一个连接
第一个请求在25秒后返回了数据
第二个请求在第50秒返回了数据
第三个请求返回504(Nginx默认60s超时)
结论: 一个PHP子进程只能同时处理一个请求,多余的未分配的请求任务堆积在Master主进程中等待空闲子进程
8. 既然PHP子进程某一瞬间只能同时处理一个任务,
从这个理论出发,有人就会有疑问了,是不是服务器开启100个PHP子进程,那么这台服务器的最大并发就是100?
这个地方需要弄清楚并发的概念,并发并不是只一瞬间能处理多少请求,而是指在正常人可以接收的等待时间内(比如2秒)
可以处理多少个请求,所以并发数量是远远超过100的
测试PHP-FPM的工作流中的疑惑点的更多相关文章
- 【转】SharePoint工作流中常用的方法
SharePoint中使用工作流对象模型. SharePoint工作流对象模型在Microsoft.SharePoint.Workflow命名空间.你可以利用此对象模型对你的工作流进行编程.你可以启动 ...
- 关于 self 和 super 在oc 中 的疑惑 与 分析
关于 self 和 super 在oc 中 的疑惑 与 分析 面试一定都是很注重 基础的,不管高级还是初级. 虽然基础好跟基础不好都可以写 代码,网上那么多资料. 区分高低也就是研究的深度和广度 ...
- 测试开发技术:DOM中 innerHTML、innerText、outerHTML、outerText的区别
测试开发技术:DOM中 innerHTML.innerText.outerHTML.outerText的区别 我们在做web自动化的过程中通过dom处理web页面元素,那么你就要了解innerHT ...
- 通过ALM OTA API获取test case的信息,并上传测试结果到test set中
ALM提供了OTA接口,可以用来获取和上传测试数据到ALM.比如获取Test case的step信息.上传测试结果到test instance. 在ALM的Help中可以下载相关文档,这里以ALM11 ...
- javascript状态机及在工作流中的应用
#javascript状态机及在工作流中的应用 ##状态机 什么叫状态机(Finite State Machine),书面上的解释可以自己借助搜索引擎寻找到.通俗地来讲是一个状态定义.查找.切换和事件 ...
- Kail Linux渗透测试教程之在Metasploit中扫描
Kail Linux渗透测试教程之在Metasploit中扫描 在Metasploit中扫描 在Metasploit中,附带了大量的内置扫描器.使用这些扫描器可以搜索并获得来自一台计算机或一个完整网络 ...
- odoo 在原有工作流中添加审批流
odoo 在原有工作流中添加审批流 步骤: 1.加入所需的工作流节点以及相连的线(即所添加的审批流),代码如下: <?xml version="1.0" encoding=& ...
- [测试] 试用Hadoop 2.2中的HDFS NFS
Hadoop 2.2中正式启用了hdfs nfs功能,使得hdfs的通用性迈进了一大步.在公司让小朋友搭建了一下,然后我自己进行了一点简单的试验,有一点收获,记录在此. 理论 使用hdfs nfs功能 ...
- 算法导论----VLSI芯片测试; n个手机中过半是好的,找出哪些是好手机
对于分治(Divide and Conquer)的题目,最重要是 1.如何将原问题分解为若干个子问题, 2.子问题中是所有的都需要求解,还是选择一部分子问题即可. 还有一点其实非常关键,但是往往会被忽 ...
随机推荐
- 1.typescirpt学习之路,*.d.ts和@types关系理解
今天看了看ts,文档上很多没用讲,小编疑惑了很久一个问题! *.d.ts和@types啥关系,小编查阅了很多文档,才弄明白. 首先,@types是npm的一个分支,我们把npm包发上去,npm包就会托 ...
- [bzoj1008] 越狱
Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 数据 ...
- POJ 1436.Horizontally Visible Segments-线段树(区间更新、端点放大2倍)
水博客,水一水. Horizontally Visible Segments Time Limit: 5000MS Memory Limit: 65536K Total Submissions: ...
- [golang]Golang实现高并发的调度模型---MPG模式
Golang实现高并发的调度模型---MPG模式 传统的并发形式:多线程共享内存,这也是Java.C#或者C++等语言中的多线程开发的常规方法,其实golang语言也支持这种传统模式,另外一种是Go语 ...
- vue中父级与子组件生命周期的先后顺序
1.vue的生命周期 2.views/createrCustormer.vue为父级 <template> <expressService /> </ ...
- 【0521模拟赛】小Z爱划水
题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他 ...
- EasyEarth三维可视化解决方案——智慧河长
EasyEarth—— 为河长装上“千里眼.顺风耳” 为各级河长办应急指挥.任务指派. 实绩考核提供快速直观的 高效.精准.智能化决策平台. 河长制背景 我国治水工作呈现出新老问题交织态势,河湖管理保 ...
- CFD-Post批处理(在一系列算例同一位置截取速度云图)
批量在一系列算例的同一位置截取面,并显示截面的速度分布云图 现在我们有一系列的算例 我们打开CFD-Post 我们编写如下的Python代码来实现在一系列算例的同一位置截面,并显示界面的速度分布云图 ...
- windows 10下启用docker的k8s集群
安装Docker Desktop后,由于国内无法下载到Kubernete的文件,在Docker Desktop设置里勾选启用Kubernete一直显示”Kubernete is starting”状态 ...
- 第07组 Beta版本演示
组长博客:求戳 队名:摇光 成员 学号 姓名 组长 031702203 容慧珺 杨明哲 031702202 高星 杨明哲 031702307 黄森敏 杨明哲 031702308 朱丽辰 杨明哲 031 ...