简单谈谈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入门速成(2)
Oct 09 PHP
深入解析php模板技术原理【一】
Jan 10 PHP
php flush类输出缓冲剖析
Oct 19 PHP
javascript 小型动画组件与实现代码
Jun 02 PHP
PHP小技巧之函数重载
Jun 02 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
CI框架中zip类应用示例
Jun 17 PHP
php实现读取超大文件的方法
Jul 28 PHP
PHP中读取照片exif信息的方法
Aug 20 PHP
php通过asort()给关联数组按照值排序的方法
Mar 18 PHP
php验证码生成代码
Nov 11 PHP
详解PHP对数组的定义以及数组的创建方法
Nov 27 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
基于PHP制作验证码
2016/10/12 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
Python实现的批量下载RFC文档
2015/03/10 Python
python发送HTTP请求的方法小结
2015/07/08 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
python使用opencv读取图片的实例
2017/08/17 Python
Python编程实现蚁群算法详解
2017/11/13 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
Python 自由定制表格的实现示例
2020/03/20 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
英文道歉信
2015/01/20 职场文书
单位考核鉴定意见
2015/06/05 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
Android实现图片九宫格
2022/06/28 Java/Android