简单谈谈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 相关文章推荐
一个简单的自动发送邮件系统(三)
Oct 09 PHP
php中处理模拟rewrite 效果
Dec 09 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
Oct 09 PHP
ajax实现无刷新分页(php)
Jul 18 PHP
PHP调用Webservice实例代码
Jul 29 PHP
php添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
zend framework重定向方法小结
May 28 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 PHP
PHP延迟静态绑定的深入讲解
Apr 02 PHP
PHP的mysqli_select_db()函数讲解
Jan 23 PHP
详解PHP神奇又有用的Trait
Mar 25 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 base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
Javascript 对象的解释
2008/11/24 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
python批量生成本地ip地址的方法
2015/03/23 Python
简单学习Python time模块
2016/04/29 Python
python方向键控制上下左右代码
2018/01/20 Python
实例讲解python中的协程
2018/10/08 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
Django组件content-type使用方法详解
2019/07/19 Python
python中删除某个元素的方法解析
2019/11/05 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
学python最电脑配置有要求么
2020/07/05 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
主题教育活动总结
2014/05/05 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
作息时间调整通知
2015/04/22 职场文书
开国大典观后感
2015/06/04 职场文书
2015年科普工作总结
2015/07/23 职场文书
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript