概要

php.ini

l  max_execution_time

l  max_input_time

php-fpm.conf

l  process_control_timeout

l  request_terminate_timeout

l  request_slowlog_timeout

max_execution_time与max_input_time

max_execution_time

描述:每个脚本最大可执行时间,cli模式下为0

max_input_time

描述:每个脚本花在解析请求数据上的最大时间,cli模式下为-1

三个阶段

l  php_module_startup

l  php_request_startup

l  php_execute_script

两种情况

l  max_input_time != -1

l  php_module_startup阶段赋值EG(timeout_seconds)=max_execution_time

l  php_request_startup阶段设置定时器,时间为max_input_time

l  php_execute_script阶段重设定时器,时间为max_execution_time

总结:此时php脚本执行的最大时间为max_input_time+max_execution_time

l  max_input_time = -1

l  php_module_startup阶段赋值EG(timeout_seconds)=max_execution_time

l  php_request_startup与php_execute_script阶段设置一个定时器,时间为EG(timeout_seconds)

总结:此时php脚本执行的最大时间为max_execution_time

总结:定时器时间算的是占用cpu的大时间(包括用户态以及内核态),而sleep()这样的系统调用会让进程挂起,不占用cpu时间,因此max_input_time以及max_execution_time时间不包括sleep的

process_control_timeout

描述:process_control_timeout是留给子进程处理来自master进程信号的时间限制

分析:master根据接收到的信号以及当前的大fpm运行状态决定发送给worker进程的是SIGQUIT还是SIGTERM,同时注册时间为process_control_timeout的定时时间,如果在process_control_timeout时间内子进程没退出,master就会升级信号,SIHQUIT->SIGTERM,SIGTERM->SIGKILL,当信号为SIGTERM时还会注册1s的定时事件,留多1秒给worker进程结束,1秒后还未结束,信号升级为SIGKILL,直接终止worker进程

request_terminate_timeout与request_slowlog_timeout

request_terminate_timeout

描述:执行一个请求的超时时间,在这之后worker进程将被终止。(官方解析:此选项应该用在max_execution_time不能被停止脚本执行的时候)

此处引用两个例子来进行说明

例子1代码:

<?php

$a = time();

echo ‘begin’;

for ($i = 0;;$i++) {

if (time() - $ime > 10) {

break;

}

}

echo ‘end’;

?>

例子2代码:

<?php

echo ‘begin’;

sleep(10);

echo ‘end’;

?>

l  max_execution_time为20,request_terminate_timeout为3

例子1结果:出现报错,程序执行时间为3秒

例子2结果:出现报错,程序执行时间为3秒

l  max_execution_time为3,request_terminate_timeout为20

例子1结果:程序终止,程序运行时间为3秒

例子2结果:结果正常

总结:max_execution_time算的是占用cpu的时间(也就是脚本自身执行的时间)类似system(),sleep(),操作数据库等的时间不算在内;request_terminate_timeout算的是worker的时间;

request_slowlog_timeout

描述:执行一个请求的超时时间,在这之后的php的backtrace会被输出到slowlog中

master心跳检测中心跳时间heartbeat的简化算法

算法目的:查看worker进程状态,其中包括是否已超时

规则:

  1. 开启reqeust_terminate_timeout的情况下:heartbeat = reqeust_terminate_timeout/1000*3
  2. 未开启request_terminate_timeout的情况下:heartbeat = request_slowlog_timeout/1000*3或者为0
  3. request_terminate_timeout >= request_slowlog_timeout

ps:此处如果由于request_terminate_timeout导致超时的发生的话,会直接kille掉worker进程,之后内核挥手client_socket,nginx返回502错误给客户端

最新文章

  1. 如何在 TFS 中使用 Git
  2. MySQL插入数据返回id
  3. case when完成不同条件的显示
  4. Oracle VM VirtualBox 5.0 CentOS 6.4 共享文件夹
  5. 【JAVA版】Storm程序整合Kafka、Mongodb示例及部署
  6. nuc950支持nand的mtd驱动的kernel修改
  7. io 测试
  8. Linux如何查找大文件或目录总结及在全部目录中查找
  9. ES6函数的拓展
  10. C++对象模型的那些事儿之六:成员函数调用方式
  11. java代码的编译、执行过程
  12. Centos7 安装redis
  13. 【代码笔记】Web-Javascript-javascript break和continue语句
  14. Testing - 软件测试知识梳理 - 自动化测试
  15. webpack 4 升级点
  16. [转载]FMS Dev Guide学习笔记(验证用户)
  17. jQuery异步获取json数据的2种方式
  18. 【Unity】状态机的状态改变及其回调
  19. “全栈2019”Java第九十八章:局部内部类访问作用域成员详解
  20. [转]使用依赖关系注入在 ASP.NET Core 中编写干净代码

热门文章

  1. JZOJ8月8日提高组反思
  2. Python模块学习遇到的问题
  3. 第14.6节 使用Python urllib.request模拟浏览器访问网页的实现代码
  4. Scrum 冲刺第七天
  5. jvm 模型
  6. 【题解】NOI 系列题解总集
  7. DVWA各级文件包含漏洞
  8. SpringBoot集成Swagger2并配置多个包路径扫描
  9. 第一篇:docker 简单入门(一)
  10. windows宿主机访问ubuntu虚拟机中的docker服务