简单谈谈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中常用数组处理方法实例分析
Aug 30 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
Jan 07 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
php获取百度收录、百度热词及百度快照的方法
Apr 02 PHP
php实现的mysqldb读写分离操作类示例
Feb 07 PHP
使用php自动备份数据库表的实现方法
Jul 28 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
浅谈PHP中如何实现Hook机制
Nov 14 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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
解析数组非数字键名引号的必要性
2013/08/09 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
简述JS控制台的使用
2018/07/15 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
python实现的简单文本类游戏实例
2015/04/28 Python
连接Python程序与MySQL的教程
2015/04/29 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
python输出带颜色字体实例方法
2019/09/01 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
python实现磁盘日志清理的示例
2020/11/05 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
马耳他航空公司官方网站:Air Malta
2019/05/15 全球购物
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
高校自主招生自荐信
2013/12/09 职场文书
实习单位接收函
2014/01/11 职场文书
创先争优一句话承诺
2014/05/29 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
求职自我评价范文100字
2014/09/23 职场文书
鼋头渚导游词
2015/02/05 职场文书
多人股份制合作协议书
2016/03/19 职场文书