简单谈谈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实现链结人气统计
Oct 09 PHP
PHP新手上路(五)
Oct 09 PHP
mysql总结之explain
Feb 27 PHP
php 计划任务 检测用户连接状态
Mar 29 PHP
php在数组中查找指定值的方法
Mar 17 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
php图片裁剪函数
Oct 31 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
Jun 06 PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
php pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
div移动 输入框不能输入的问题
2009/11/19 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
JavaScript获取当前网页最后修改时间的方法
2015/04/03 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
Vue中的字符串模板的使用
2018/05/17 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
简述JS控制台的使用
2018/07/15 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
Vue实现跑马灯效果
2020/05/25 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
Django项目基础配置和基本使用过程解析
2019/11/25 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
航海技术专业毕业生推荐信
2014/07/09 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
考察邀请函范文
2015/01/31 职场文书
应聘教师求职信范文
2015/03/20 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书