繁体   English   中英

在脚本中获取PHP-FPM超时限制

[英]Get the PHP-FPM timeout limit in script

我正在使用FPM在PHP 5.6.26上的一个无所事事的盒子上进行开发。

我正在测试电池,以通过一系列请求命中REST端点,以尝试捕获远程端的间歇性错误。 在我的电池中,我有一个要运行的重复次数的变量。 因为我不知道每个请求将花费多长时间,所以有时重复很多会导致脚本超时,并且我将无法查看已运行请求的结果。

因此,我没有指定重复次数,而是决定最大化测试运行次数。 我使用ini_get('max_execution_time')监视脚本执行已经进行了多长时间,并尝试保释是否接近超时。

但是,我注意到使用这种方法时,我得到的测试运行次数没有以前获得的那么多。 我进行了更多的调试,发现超过了max_execution_time!

我做了一些进一步的研究,发现PHP-FPM有其自己的超时限制,而当我的脚本快死了时,我碰到了那个超时限制:

[Fri Oct 28 19:41:04.491557 2016] [proxy_fcgi:error] [pid 2343:tid 140619049568000] (70007)The timeout specified has expired: [client 192.168.253.1:52431] AH01075: Error dispatching request to :, referer: http://local.mysite.com/test

因此,知道我想在允许的范围内运行测试,如何从脚本中的PHP-FPM获取实际的超时值?

我知道/etc/php-fpm.d/www.conf有设置,但是我不想在脚本中硬编码该值,以防它更改。

简而言之,请使用getrusage() ,而不要使用time()

现在多一点。 max_execution_time限制的脚本执行时间是在脚本内部花费的时间。 set_time_limit doc ,第二个注意事项:

确定脚本已运行的最大时间时,不包括执行脚本之外发生的活动上的任何时间,例如使用system()进行系统调用,流操作,数据库查询等。 在测量的时间是真实的Windows上不是这样。

如您已经注意到的,最简单的示例是:使用max_execution_time = 30的sleep(35)可以。

如果您使用time() ,那么即使您仍有时间来编写脚本,也总是会在30秒的现实世界中结束。

因此,您将需要脚本中的实时时间,而不是真实世界的时间。 要获得这种时间,您需要使用功能getrusage()及其答案ru_utime.tv_secru_utime.tv_usec键。

第二步,当您使用PHP-FPM时,它是回答多个请求的相同过程。 这意味着一个进程将把一个ru_utime的统计信息从一个请求转移到另一个请求。 您将必须在脚本开始时获取ru_utime.tv_sec值并计算差异。 当这种差异接近max_execution_time您可以结束重复/循环。

就像是 :

$gru = getrusage();
$gru_start = $gru['ru_utime.tv_sec'];
$gru_end = $gru_start;

// Considering that duration of one iteration in
// the next while loop is less than 1 second,
// we use this as the max limit.
$max_time = ini_get('max_execution_time') - 1;

while ($gru_end - $gru_start < $max_time) {
    // long and repetitives tasks
    // ....

    // could use a counter to not call this function at each iteration,
    // but only once every 10, 100, 1000 ... times.
    $gru = getrusage();
    $gru_end = $gru['ru_utime.tv_sec'];
}

或将其转换为功能...

希望它能使您走得更远。 坦白地说,我在这里的理解范围有限,如果适当地使用,此解决方案可能会有些脆弱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM