测试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.子问题中是所有的都需要求解,还是选择一部分子问题即可. 还有一点其实非常关键,但是往往会被忽 ...
随机推荐
- 了解Python-白 驹 过 隙 , 忽 然 而 已
白 驹 过 隙 , 忽 然 而 已 人 生 苦 短,我 用 Python -- Life is short , you need Python 代码量少,同一样问题 ,用不同的语言解决时,一般情况下P ...
- 第12组 Alpha冲刺(4/6)
Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 由于这两天在修bug,燃尽图没有下降 展示Git当日代码/文档签入记录(组内共享) 注: 由于Git ...
- 【洛谷】P1032 字串变换
题目地址:https://www.luogu.org/problemnew/show/P1032 洛谷训练场BFS的训练题呀. “BFS不就是用队列的思想去遍历一切情况嘛.我已经不是小孩子了,我肯定能 ...
- Ecms7.5版CK编辑器保留word格式如何修改
7.5版的编辑器默认会清除多余的word代码,如果要保留word格式怎么修改? CKeditor编辑器默认复制会清除多余word代码,如果要保留word格式可以按下面修改配置: 修改 /e/admin ...
- (五)Cisco dhcp snooping实例3-多交换机环境(DHCP服务器和DHCP客户端位于同VLAN)
试验拓扑 环境:dhcp server和dhcp客户端属于同vlan,但是客户端属于不同的交换机,在L2和L3交换机开启dhcp snooping后得出如下结论 L3交换机的配置 ip dhcp po ...
- python 文件夹下的图片转PDF
from PIL import Image import os def rea(path, pdf_name): file_list = os.listdir(path) pic_name = [] ...
- mysql中的递归
别人问的一个需求: 数据库里面保存的是父子关系结构: 展示出来的需要根据子类一直查到顶类后将名称全部放一个字段里面,如下: 比如输入的code是1099,名称要显示 配料/花椒/ces ...
- 关于H5项目开发中TS(或JS)文件按照顺序编译成一个文件的记录
由于js的执行特性,多个js文件合成一个文件或者进行多个js文件加载时,时需要按照指定的顺序进行的,否则会出现报错的情况. 我们看一下目前几个主流H5引擎的做法. 白鹭的做法 当前版本的做法 在tsc ...
- 学习使用junit4
目录 一.junit介绍 二.junit4的简单使用
- nodejs 读取目前下所有文件
var fs = require('fs'); var join = require('path').join; function getJsonFiles(jsonPath) { let jsonF ...