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

时间:2016-10-29 17:21:24

标签: php timeout

我正在使用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中有设置,但我不想在我的脚本中对该值进行硬编码,以防它发生变化。

1 个答案:

答案 0 :(得分:2)

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

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

  

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

最简单的示例:sleep(35) = max_execution_time = 30就可以了,正如您已经注意到的那样。

如果您使用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'];
}

或将其转换为函数......

希望它能带给你更多。说实话,我在这里的理解极限,这个解决方案可能有点脆弱,使用适当的照顾。

相关问题