简单谈谈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中函数的形参与实参的问题说明
Sep 01 PHP
sphinx增量索引的一个问题
Jun 14 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
Feb 13 PHP
PHP整数取余返回负数的相关解决方法
May 15 PHP
PHP设计模式之迭代器模式
Jun 17 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
Aug 18 PHP
php中通用的excel导出方法实例
Dec 30 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 PHP
在Laravel中使用MongoDB的方法示例
Nov 11 PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 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
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
浅析javascript 定时器
2014/12/23 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
Python中的闭包实例详解
2014/08/29 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
python实现将文本转换成语音的方法
2015/05/28 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
python中pika模块问题的深入探究
2018/10/13 Python
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
三星法国官方网站:Samsung法国
2019/10/31 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
幼教个人求职信范文
2013/12/02 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
运动会开幕式主持词
2014/03/28 职场文书
会计专业求职信
2014/08/10 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
民事诉讼代理授权委托书范本
2014/10/08 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书