前段时间一位同事跟我说php脚本超时时间以fpm配置优先。通过本身测试后,其实否则,前面的观点只是在某些状况下成立。php
php脚本超时时间能够在php.ini的max_execution_time和fpm.conf的request_terminate_timeout参数两处进行设置.那么这二者有什么区别呢?linux
当咱们设置php.ini的max_execution_time参数后,zend引擎处理脚本时,其内部会根据设定的时间定义一个定时器(setitimer),这是linux的API。chrome
而fpm.confrequest_terminate_timeout的检测是经过主进程遍历定时事件fpm_pctl_heartbeat来判断PHP脚本执行是否超时。数据库
下面经过实例进行分析。浏览器
example:安全
$a = time(); var_dump('begin'); for($i=0;;$i++){ if(time()-$a>10){ break; } } var_dump('end');
上面的代码比较容易理解,首先,输出“begin”字符串,10秒后再输出“end”字符串。函数
方案1:修改php.ini的配置max_execution_time=3,fpm.conf的request_terminate_timeout=20.测试
example执行的结果:spa
string(5) "begin"
1
chrome浏览器抓包:.net
根据上面运行的结果和效果图能够看出,example运行3秒后停止。也就是说,此时,php.ini的max_execution_time生效了。
方案2:修改php.ini的配置max_execution_time=20,fpm.conf的request_terminate_timeout=3.
example执行的结果:
chrome浏览器抓包:
从上面的截图能够看出,程序也只执行了3S。此时脚本的运行受到fpm.conf的request_terminate_timeout配置影响。
从上面两个方案推断出,对于example实例,php脚本取max_execution_time与request_terminate_timeout最小值做为脚本的超时时间。那是否是只要设置max_execution_time参数便可呢?
下面继续分析,咱们对example代码稍微调整下。
$a = time(); var_dump('begin'); sleep(10); var_dump('end');
这段代码与上面功能相似,惟一的区别是由循环改为sleep()。
采用方案1的配置,结果以下:
string(5) "begin" string(3) "end"
1
采用方案2的配置,结果以下:
example执行的结果:
对比两个结果能够看出此时max_execution_time的配置未起到效果。如下是引用php手册的一段话(http://php.net/manual/zh/func...:
set_time_limit()函数和配置指令max_execution_time只影响脚本自己执行的时间。任何发生在诸如使用system()的系统调用,流操做,数据库操做等的脚本执行的最大时间不包括其中,当该脚本已运行。在测量时间是实值的Windows中,状况就不是如此了。
SO,为了保证生产环境的安全,建议同时设置max_execution_time和request_terminate_timeout参数值。