php 执行超时问题探讨分析

前一段,查看php-fpm.conf 定义的slow log,发现有很多的执行超时,记录格式如下:
[26-Apr-2016 18:02:16] WARNING: [pool www] child 7883, script ‘/***/index.php’ (request: “GET /index.php”) executing too slow (56.565008 sec), logging
从日志记录的结果看,此请求执行了56秒多。但是查看php.in 定义却发现max_execution_time = 5,顿感好奇,最大执行5秒为何为执行了近一分钟呢?这个max_execution_time 难道定义的不是请求执行时间吗?遂去google了一下。

在google数十页结果中找到两篇文章,比较有参考意义:
此2篇文章都不约而同的说到了:
在 php-cgi(php-fpm) 中,max_execution_time 参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的参数:request_terminate_timeout。
可是经过我的数次测试,发现在 上面的那段话确是”部分正确”的。
测试环境:
centos  7.0
nginx 1.63
php 7.05
php.ini 依然定义max_execution_time = 5
经过对比测试:max_execution_time,request_terminate_timeout 参数控制着不同的超时场景.

1.request_terminate_timeout确实可以控制php的执行时间:

如果执行的php时间大于request_terminate_timeout时间,php-fpm 会结束执行,然后浏览器会收到响应  http:404;

2.  max_execution_time  参数也是有起作用的:

需要说明的是这个时间指的是cpu占用时间,也就是把php进程sleep了,是不会触发的,只有占用的cpu时间 超过了 max_execution_time  时间,才会触发  max_execution_time 超时错误。
通过代码证明:
2.1  sleep 不会触发 max_execution_time   错误
<?php
ini_set('display_errors','On');
sleep(10);
echo 'hi';
?>

 

执行结果参考下图:

php sleep执行后没有超时图片

2.2  占用cpu 执行5秒钟后,出现超时错误。

while (true)
{
    $i++;
}

执行结果,参考下图:

php执行后超时图片

结论:

在 php-cgi(php-fpm) 中:

php.ini :max_execution_time 参数控制 php 脚本最大cpu占用时间。

php-fpm.conf :request_terminate_timeout 参数控制 php 脚本的最大执行时间。

 

 

作者: 白金马桶

天道酬勤...

发表评论