测试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.子问题中是所有的都需要求解,还是选择一部分子问题即可. 还有一点其实非常关键,但是往往会被忽 ...
随机推荐
- shell脚本编程基础之for循环
循环结构 循环需要有进入条件和退出条件,如果没有退出条件,则就会一直循环下去 for 变量 in 列表:do 循环体 done 生成列表及示例 {1..100}:生成1到100的整数列表 `comma ...
- 小技巧--解决eclipse导入的jar文件后,无法使用默认包中的方法问题
问题:我已经导入了stdlib的jar文件,但是由于包是(default package)所以无法使用包中的方法 解决方法: 1.新建一个项目 2.新建一个文件夹 3.打开项目,新建一个包,然后导入j ...
- AdaptIS: Adaptive Instance Selection Network
AdaptIS: Adaptive Instance Selection Network 2019-09-19 12:58:07 Paper: https://arxiv.org/pdf/1909.0 ...
- Spring Boot-intellij idea导入方式搭建SpringBoot
Spring Boot概念 从最根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用.简便起见,该框架也提供了命令行界面,它可以用来运行和测试Boot应用.框架的发布版 ...
- 【java爬虫】利用webmagic框架实战demo
webmagic框架:http://webmagic.io/ WebMagic的结构分为Downloader.PageProcessor.Scheduler.Pipeline四大组件 PageProc ...
- Mac下 python2和python3共存
一般是python2默认安装了,python3没有安装,这时候一般使用命令:brew install python3 进行安装 不同方法安装python的路径是不一样的,如下所示: 接下来就要看具体步 ...
- sysfile20191122
ass_s_ccp_ft:-108; ass_s_ccp_all:-108; ass_tag_ft:-105; ass_tag_all:-105; rept_port:9000; Q_value:0. ...
- SpringCloud中遇到的问题总结
1.如果数据库URL字符串中不加serverTimezone=GMT%2B8且数据库未设置时区,会报如下错误 Caused by: com.mysql.cj.exceptions.InvalidCon ...
- IDEA 开发javafx: error: java:package javafx.application does not exist
1)jdk使用1.8, 1.7中未包含javafx相关内容. 2)确保classpath中加入了javafx包路径. 在“file” --> "project structure&qu ...
- Nginx 配置 HTTPS SSL
配置文件如下:[可以在阿里云上申请免费证书] #user nobody; worker_processes 1; events { worker_connections 1024; } http { ...