我正在使用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
中有设置,但我不想在我的脚本中对该值进行硬编码,以防它发生变化。
答案 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_sec
和ru_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'];
}
或将其转换为函数......
希望它能带给你更多。说实话,我在这里的理解极限,这个解决方案可能有点脆弱,使用适当的照顾。