• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

PHP-max_execution_time与fpm.request_terminate_timeout介绍

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

前段时间一位同事跟我说php脚本超时时间以fpm配置优先。经过自己测试后,其实不然,前面的观点只是在某些情况下成立。

php脚本超时时间可以在php.ini的max_execution_time和fpm.conf的request_terminate_timeout参数两处进行设置.那么这两者有什么区别呢?

当我们设置php.ini的max_execution_time参数后,zend引擎处理脚本时,其内部会根据设定的时间定义一个定时器(setitimer),这是linux的API。

而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执行的结果:

string(5) "begin"

hrome浏览器抓包:

 


根据上面运行的结果和效果图可以看出,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"

采用方案2的配置,结果如下:
example执行的结果:

 


对比两个结果可以看出此时max_execution_time的配置未起到效果。以下是引用php手册的一段话(http://php.net/manual/zh/function.set-time-limit.php):

set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。在测量时间是实值的Windows中,情况就不是如此了。

SO,为了保证生产环境的安全,建议同时设置max_execution_time和request_terminate_timeout参数值。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
关于PHP的一句话木马发布时间:2022-07-10
下一篇:
今日分享一点干货。PHP中课程表的实现。发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap