简单谈谈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操作文件方法问答
Mar 16 PHP
理解PHP5中static和const关键字的区别
Mar 19 PHP
关于Intype一些小问题的解决办法
Mar 28 PHP
PHP file_exists问题杂谈
May 07 PHP
使用dump函数,给php加断点测试
Jun 25 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
Jul 11 PHP
php使用glob函数快速查询指定目录文件的方法
Nov 15 PHP
初识laravel5
Mar 02 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
Jul 15 PHP
Laravel5权限管理方法详解
Jul 26 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
php将数据库导出成excel的方法
2010/05/07 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
php购物车实现方法
2015/01/03 PHP
微信公众平台开发之配置与请求
2015/08/26 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
FLASH 广告之外的链接
2008/12/16 Javascript
jquery遍历input取得input的name
2009/04/27 Javascript
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
ajax异步请求详解
2017/01/06 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
学习型党组织建设经验材料
2014/05/26 职场文书
校园安全标语
2014/06/07 职场文书
专题组织生活会方案
2014/06/15 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android