php-fpm正在生成页面时,浏览器刷新后,php-fpm会退出吗?

好久没写博客了,因为没有啥可写。

之所以有此疑问,是因为看了一篇大牛的文章:PHP升级导致系统负载过高问题分析。看完后,其中有些文字触发了我这个想法,也想验证一下。

方案,用tcpdump抓包,用strace获取系统调用

tcpdump port 8080 and port 9000 -s 0 -w temp

8080是nginx的服务端口,9000是php-fpm服务的端口,抓这两个端口是想看到浏览器、nginx、php-fpm三者之间的交互。抓完包后,用wireshark分析,如下:

tcp.port==46540 or tcp.port == 54352 //上面语句为wireshark的过滤语法,用于筛选我们感兴趣的包

解释如下:

1,46540是浏览器的端口,http-alt是nginx,54352是nginx请求php-fpm的端口,cslistener是php-fpm

2,因为我所有的操作都是在一台机器上,包括浏览器访问,所以所有的IP都是127.0.0.1

3,

A:图中第一部分,代表浏览器和nginx的三次握手的过程。

B:图中第二部分,代表浏览器向nginx请求一个URL。

C:图中第三部分,代表nginx与php-fpm三次握手的过程。

D:图中第四部分,代表nginx将浏览器的请求转发给php-fpm。

E:图中第五部分的11,13,14行,代表浏览器主动关闭了与nginx之间的连接。为什么关闭呢,因为我不断的刷新页面,在第二次刷新的时候,浏览器会关闭上一次的请求。

为什么是三次关闭,而不是四次握手关闭呢?因为第13行其实是两个包合成一个包发送了,这应该算tcp的优化吧。

F:图中第五部分的12,25行,代表nginx将浏览器关闭连接的消息,告诉了php-fpm。

G:图中第六部分,通过左边的时间可以发现,是5秒种之后,php-fpm试图向nginx返回它縇染后的页面,但nginx直接reset掉了这个连接。

为什么是5秒种之后返回呢,因为我在php程序的第一行sleep(5),用于模拟时间较长的业务逻辑处理。

分析到这里,结论已经很明显了,就是:

浏览器关闭请求后,nginx会通知到php-fpm,但php-fpm忽略了这个通知,继续处理,直到发送处理结果时,才知道了连接已经被关闭。

我想在这里,php-fpm还是有可以优化的空间的。

大家可以看下strace的结果,也可以验证上面的结论。

时间: 2024-07-30 18:47:50

php-fpm正在生成页面时,浏览器刷新后,php-fpm会退出吗?的相关文章

从一个页面打开新窗口页面,当关闭新窗口页面时,刷新原本的页面的一个方法

开发中从一个页面打开新窗口页面,当关闭新窗口页面时,需要刷新原本的页面,找到了如下方法: A页面中: <a target="_blank"  href="B.aspx"></a> B页面中: <input type="button"  value="关闭" onclick="Close();" /> <script type="text/javascrip

当你刷新当前Table时,刷新后如何回到你上一次所在位置呢?

第一: 在你刷新前保存所在位置的行号 procedure XXXClass.LockPositionEx;begin DisableControls; FHistoryRecNo := 0; FHistoryIndexName := EmptyStr; if Active then begin if IndexName <> EmptyStr then FHistoryIndexName := IndexName; IndexName := EmptyStr; if not IsEmpty t

C#屏蔽Alt+F4,解决Alt+F4关闭窗体时对话框NO后,线程不退出问题

//1.将窗体的属性KeyPrieview设置为true //keypreview属性为true的时候,就可以响应键盘事件v //2.在窗体KeyDown事件中加如下代码 private void Form1_KeyDown(object sender, KeyEventArgs e) { if( (e.KeyCode == Keys.F4)&&(e.Alt==true)) //屏蔽ALT+F4 { e.Handled = true; } } //e.Handled属性:获取或设置一个值,

强制浏览器在点击回退按钮时重载刷新页面

最近在项目中有个场景会涉及到此问题,第一反应是通过header控制估计行不通,使用的浏览器为chrome,点击回退时浏览器并不重新请求服务器也不会重新渲染页面.所以服务器header或页面中的meta信息起不了作用.这样以来,就把解决方式定位在了前端来处理,用浏览器的本地存储设置了一个临时标志位,既页面1请求到页面2时,在页面2写入标志位,在页面1里做检查是否有标志位来进行重载刷新判断.思路很明了,因为项目支持的是H5环境,想通用所有浏览器的话,如使用cookie也可达到同样的目的.

【 reload 方法】该方法强迫浏览器刷新当前页面

  [ reload 方法]该方法强迫浏览器刷新当前页面 ================================================= [一]要求刷新的窗口有一个名称,例如ABC.在要关闭的页面加入        <body onunload="javascript:ABC.location.reload()"> [二]如果要刷新的是将要关闭页面的父窗口,则可以在要关闭的页面加入 <body onunload="javascript:w

刷新页面时 select值保持不变

刷新页面时,要使下拉菜单(select).raido保持不变,用ajax是无法实现的.我想只能通过cookies才能实现.刷新前先把select或radio的值保存在cookies中,刷新后再填回去.下面是测试代码: [html] view plain <select name="sex" id="sex" onchange="save()"> <option  value="01" selected >

在IE浏览器中执行OpenFlashChart的reload方法时无法刷新的解决方法

由于项目需求,需要在网页上利用图表展示相关数据的统计信息,采用了OpenFlashChart技术.OpenFlashChart是一款开源的以Flash和Javascript为技术基础的免费图表,用它能创建一些很有效果的报表分析图表.最重要的是它是开源和免费的,支持多种语言.首先在官网上下载开发包,里面包含了所需的flash文件.js文件以及多种语言的demo,这些demo写的非常详细,可以进行参考开发.由于项目使用.net来开发,所以我学习了一下开发包中对应的dotnet代码,这个.net项目采

关闭open页面时刷新父页面列表

var winObjEI = window.open("/Invoice/InvoiceViewEI?invoiceid=" + data.InvoiceId); var isClose = 1; //关闭open页面时刷新父页面列表 var loop = setInterval(function () { if (winObjEI.closed && isClose == 1) { isClose--; //这里写刷新代码 } }, 1000); isClose字段保

解决让刷新页面时不提示 &quot;重试或取消”对话框

如果刷新一个已经提交过的页面时,系统总是会提示一个 "重试或取消”的对话框.,如果是一个普通的页面,好象也无所谓,有就有,大不了多点一下.但是当我们是在子窗体中刷新父窗体时,就显得有点多余了.所以就想把这个对话框给去了.找了很的办法.总结一下. 一, window.opener.location.reload() 如果改页面没提交过,这个方法好使.但是这个页面一旦提交过后,系统就会提示"重试或取消”的对话框. 二 window.opener.location = window.open