简单谈谈PHP中的Reload操作


Posted in PHP onDecember 12, 2016

前言

有很多前辈告诫过我们,reload 能保证整个过程的平滑性,所谓平滑性指的是在 reload 的过程中,旧的进程在处理完当前请求前不会提前终止。很多年来,我从来没有质疑过这种说法,直到有一天,当我 reload 的时候,出现了 502 错误,让我不得不重新思考。

如何重现问题呢?让我们写一个简单的脚本来模拟:

<?php

sleep(11);
echo "foo";

?>

此时用浏览器浏览这个网址,接着立刻执行 reload 操作,就能看到 502 错误了。

难道 PHP 这么弱?连 reload 基本的平滑性都无法保证?答案当然是否定的,实际上通过 process_control_timeout 参数可以实现我们的目标。可惜这个参数缺省是 0,也就是不生效,本文把它设置成 10s。重新执行之前的实验步骤,这一次正常输出了结果。不过如果你多做几次实验的话,可能会发现当我们 reload 的时候,sleep 立刻就结束了,这是因为 sleep 收到 reload 发出的信号后直接返回了,下面让我们再改写一下脚本:

<?php

sleep(11);
echo "foo";
sleep(11);
echo "bar";

?>

重新执行之前的实验步骤,你会发现 502 错误又出现了。这是因为 reload 虽然让第一个 sleep 立刻结束了,但是第二个 sleep 还是有效的,而且超过了 process_control_timeout 的时间限制。如果我们把 process_control_timeout 设置为 12s,那么就又好了。

如此说来,我们只要给 process_control_timeout 设置一个合理的数值就能保证 reload 操作的平滑性,不过到底多大是合理的数值呢?太小的话可能起不到作用,太大的话会不会有副作用?让我们带着疑问重复上一次实验,不过这次我们再加一个监控:

shell> watch -n1 'ps aux | grep php[-]fpm'

此监控的目的是为了观察 reload 过程中 PHP-FPM 进程数的变化情况,为了让效果更明显些,建议把 PHP-FPM 的启动方式改成 static 模式,同时进程数不要太多。

当我们重复上一次实验的时候,结果发现除了正在执行请求的进程,其它进程直接就被干掉了,而新进程又没有立刻启动,就这样一直卡到最后一个旧进程执行完后新进程才完成启动过程。在此期间,如果有别的请求进来,那么无疑它无法立刻得到响应。

根据我们的实验可以得出结论:缺省情况下,PHP-FPM 无法保证平滑的执行 reload 操作,必须设置一个合理的 process_control_timeout 才行,同时需要注意的是其值不能设置的过大,否则系统可能出现更为严重的请求堵塞问题。

总结

以上就是关于PHP中Reload操作的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
谈PHP生成静态页面分析 模板+缓存+写文件
Aug 17 PHP
PHP生成Flash动画的实现代码
Mar 12 PHP
php开发过程中关于继承的使用方法分享
Jun 17 PHP
php获取网页标题和内容函数(不包含html标签)
Feb 03 PHP
php实现最简单的MVC框架实例教程
Sep 08 PHP
基于php实现七牛抓取远程图片
Dec 01 PHP
PHP常用文件操作函数和简单实例分析
Jun 03 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
Feb 28 PHP
详解PHP如何更好的利用PHPstorm的自动提示
Aug 18 PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 PHP
php数值计算num类简单操作示例
May 15 PHP
PHP实现简易用户登录系统
Jul 10 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 #PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 #PHP
php+ajax+json 详解及实例代码
Dec 12 #PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 #PHP
Zend Framework数据库操作方法实例总结
Dec 11 #PHP
smarty模板数学运算示例
Dec 11 #PHP
Zend Framework入门应用实例详解
Dec 11 #PHP
You might like
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
php的一个简单加密解密代码
2014/01/14 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
php实现简易计算器
2020/08/28 PHP
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
js实现分割上传大文件
2016/03/09 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
PyQt5每天必学之布局管理
2018/04/19 Python
解决Mac安装scrapy失败的问题
2018/06/13 Python
python实现机器学习之多元线性回归
2018/09/06 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
Python制作词云图代码实例
2019/09/09 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
矫正人员思想汇报
2014/01/08 职场文书
超越自我演讲稿
2014/05/21 职场文书
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL