PHP-max_execution_time与fpm.request_terminate_timeout介绍

前段时间一位同事跟我说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"

chrome浏览器抓包:
这里写图片描述

根据上面运行的结果和效果图可以看出,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_timerequest_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_timerequest_terminate_timeout参数值。

### 解决 `fastcgi_read_timeout` 超时设置的相关方法 在 Nginx 配置中,`fastcgi_read_timeout` 是用于定义 FastCGI 服务器通信时读取响应的超时时间。如果此值过低,则可能导致客户端接收到 `504 Gateway Time-out` 错误[^4]。 以下是关于如何调整或解决 `fastcgi_read_timeout` 的具体方案: #### 1. 修改 `fastcgi_read_timeout` 参数 可以通过编辑 Nginx 配置文件中的 `fastcgi_read_timeout` 来延长超时时间。推荐将其设置为一个合理的时间范围(例如 90 秒),以适应大多数场景下的请求处理需求。注意,该值不应超过 PHP-FPM 设置的最大执行时间 `max_execution_time` 和其他关联参数。 ```nginx fastcgi_read_timeout 90s; ``` 上述代码应放置在 `http`、`server` 或 `location` 块中,取决于具体的配置层次结构[^1]。 --- #### 2. 结合其他相关参数优化 除了修改 `fastcgi_read_timeout` 外,还需要关注以下几个可能影响性能的关键参数: - **`client_body_buffer_size`**: 如果上传大文件或者接收大量 POST 数据,需适当增大缓冲区大小,防止数据被写入磁盘从而降低效率[^3]。 ```nginx client_body_buffer_size 1M; ``` - **`fastcgi_buffers` 及 `fastcgi_busy_buffers_size`**: 这些参数控制内存缓存的行为。建议将 `fastcgi_busy_buffers_size` 设为 `fastcgi_buffer_size` 的两倍,以便更好地管理繁忙状态下的缓冲资源[^2]。 ```nginx fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; fastcgi_busy_buffers_size 64k; ``` - **PHP-FPM 配置同步**: 确认 PHP-FPM 中的 `request_terminate_timeout` 是否已正确设定,它决定了脚本运行的最大允许时间。两者之间需要保持一致性以免引发冲突。 ```ini request_terminate_timeout = 90s ``` --- #### 3. 测试并验证更改效果 完成以上配置后,请重启 Nginx 和 PHP-FPM 服务使改动生效,并通过实际负载测试来评估稳定性以及是否解决了原有的超时问题。 ```bash sudo systemctl restart nginx php-fpm ``` --- ### 总结 通过对 `fastcgi_read_timeout` 的合理调整以及其他辅助参数的协同优化,可以有效缓解甚至彻底消除因网络延迟等原因造成的网关超时现象。务必依据项目实际情况灵活调节各项数值,同时密切监控系统表现以防引入新的隐患。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值