[英]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_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'];
}
或将其转换为功能...
希望它能使您走得更远。 坦白地说,我在这里的理解范围有限,如果适当地使用,此解决方案可能会有些脆弱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.