简单谈谈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执行.SQL文件
Jul 05 PHP
php缓冲 output_buffering和ob_start使用介绍
Jan 30 PHP
PHP include任意文件或URL介绍
Apr 29 PHP
ThinkPHP应用模式扩展详解
Jul 16 PHP
php堆排序实现原理与应用方法
Jan 03 PHP
php类的扩展和继承用法实例
Jun 20 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
Sep 11 PHP
详解EventDispatcher事件分发组件
Dec 25 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
PHP 遍历文件实现代码
2011/05/04 PHP
php学习之function的用法
2012/07/14 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
javascript实现日期按月份加减
2015/05/15 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
vue-router传参用法详解
2019/01/19 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
Django URL传递参数的方法总结
2016/08/28 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
服装厂厂长职责
2013/12/16 职场文书
调查研究项目计划书
2014/04/29 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
公务员检讨书
2014/11/01 职场文书
2014年资料员工作总结
2014/11/18 职场文书
故宫英文导游词
2015/01/31 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
python中tkinter复选框使用操作
2021/11/11 Python