简单谈谈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 array_push 数组函数
Dec 26 PHP
谷歌音乐搜索栏的提示功能php修正代码
May 09 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
php实现获取文件mime类型的方法
Feb 11 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
Yii2超好用的日期和时间组件(值得收藏)
May 05 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
php文件后缀不强制为.php的实操方法
Sep 18 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 17 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
一个数据采集类
2007/02/14 PHP
PHP实现自动登入google play下载app report的方法
2014/09/23 PHP
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
Exjs 入门篇
2010/04/07 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
jQuery实现的调整表格行tr上下顺序
2016/01/10 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
python字典get()方法用法分析
2015/04/17 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
python如何制作缩略图
2019/04/30 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
Python算法中的时间复杂度问题
2019/11/19 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
python爬取youtube视频的示例代码
2021/03/03 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
华为C++笔试题
2014/08/05 面试题
求职信格式范本
2013/11/15 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
观后感的写法
2015/06/19 职场文书
初三英语教学反思
2016/02/15 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
python微信智能AI机器人实现多种支付方式
2022/04/12 Python
Java界面编程实现界面跳转
2022/06/16 Java/Android