简单谈谈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+DBM的同学录程序(3)
Oct 09 PHP
快速开发一个PHP扩展图文教程
Dec 12 PHP
php 注释规范
Mar 29 PHP
PHP同时连接多个mysql数据库示例代码
Mar 17 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
PHP实现QQ空间自动回复说说的方法
Dec 02 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
php禁用函数设置及查看方法详解
Jul 25 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
Yii2.0建立公共方法简单示例
Jan 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
phpfans留言版用到的install.php
2007/01/04 PHP
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
php curl 上传文件代码实例
2015/04/27 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
javascript 类定义的4种方法
2009/09/12 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
python操作gitlab API过程解析
2019/12/27 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
基于python3生成标签云代码解析
2020/02/18 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
学习标兵获奖感言
2014/02/20 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python