简单谈谈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 adodb操作mysql数据库
Mar 19 PHP
PHP中的函数嵌套层数限制分析
Jun 13 PHP
11个PHP 分页脚本推荐
Aug 15 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
Jul 05 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
Mar 31 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
php中array_fill函数的实例用法
Mar 02 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制作静态网站的模板框架(一)
2006/10/09 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
Google AJAX 搜索 API实现代码
2010/11/17 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
Highcharts入门之简介
2016/08/02 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
python解析xml文件实例分享
2013/12/04 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
Shell如何接收变量输入
2012/09/24 面试题
学生实习推荐信范文
2013/11/26 职场文书
入团者的自我评价分享
2013/12/02 职场文书
初三英语教学计划
2015/01/23 职场文书
就业导师推荐信范文
2015/03/27 职场文书
刑事法律意见书
2015/06/04 职场文书
公司管理建议书
2015/09/14 职场文书
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL