简单谈谈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 05 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
ThinkPHP模板比较标签用法详解
Jun 30 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
Nov 18 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
php实现的mongodb操作类实例
Apr 03 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
浅谈mysql_query()函数的返回值问题
Sep 05 PHP
由php中字符offset特征造成的绕过漏洞详解
Jul 07 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
PHP如何防止用户重复提交表单
Dec 09 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 前一天或后一天的日期
2008/06/28 PHP
php的大小写敏感问题整理
2011/12/29 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
php的ajax简单实例
2014/02/27 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
javascript URL锚点取值方法
2009/02/25 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
基于jQuery的js分页代码
2010/06/10 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
koa-router源码学习小结
2018/09/07 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
2019/04/16 jQuery
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
浅谈python写入大量文件的问题
2018/11/09 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
pytorch permute维度转换方法
2018/12/14 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
JDO的含义
2012/11/17 面试题
毕业生个人投资创业计划书
2014/01/04 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
2016新年年会主持词
2015/07/06 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
在js中修改html body的样式
2021/11/11 Javascript