前一段,查看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';
?>
执行结果参考下图:

2.2 占用cpu 执行5秒钟后,出现超时错误。
while (true)
{
$i++;
}
执行结果,参考下图:

结论:
在 php-cgi(php-fpm) 中:
php.ini :max_execution_time 参数控制 php 脚本最大cpu占用时间。
php-fpm.conf :request_terminate_timeout 参数控制 php 脚本的最大执行时间。