Req #78413 [PATCH]: request_terminate_timeout does not take effect after fastcgi_finish_request

From: Date: Wed, 28 Aug 2019 04:56:38 +0000
Subject: Req #78413 [PATCH]: request_terminate_timeout does not take effect after fastcgi_finish_request
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-222463@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=78413&edit=1

 ID:                 78413
 Patch added by:     turchanov@farpost.com
 Reported by:        rs dot orlov at gmail dot com
 Summary:            request_terminate_timeout does not take effect after
                     fastcgi_finish_request
 Status:             Open
 Type:               Feature/Change Request
 Package:            FPM related
 PHP Version:        Irrelevant
 Block user comment: N
 Private report:     N

 New Comment:

The following pull request has been associated:

Patch Name: Fix #78413: php-fpm request_terminate_timeout does not take effect af…
On GitHub:  https://github.com/php/php-src/pull/4637
Patch:      https://github.com/php/php-src/pull/4637.patch


Previous Comments:
------------------------------------------------------------------------
[2019-08-14 00:32:37] rs dot orlov at gmail dot com

Description:
------------
Hi there.

It is common practice to call fastcgi_finish_request as soon as response is ready to be sent and
defer some heavy load tasks after that. But here is the problem: process will no longer be
terminated if it exceeds request_terminate_timeout.

It happens because fpm_request_finished called inside fastcgi_finish_request changes request state
to FPM_REQUEST_FINISHED. But fpm_request_check_timed_out only checks processes being in state
between FPM_REQUEST_ACCEPTING and FPM_REQUEST_END.

Turns out that there is no way to limit execution time of a worker after fastcgi_finish_request.
That behavior may lead to all fpm-pool being occupied.

Possible solution may be a config option which enables fpm_request_check_timed_out for processes in
FPM_REQUEST_FINISHED state,

Test script:
---------------
<?php

fastcgi_finish_request();

$time = microtime(true);
// must be any time greater than configured request_terminate_timeout
$delaySec = 10;

while ($delaySec > (microtime(true) - $time)) {
	usleep(100000);
}


Expected result:
----------------
Php worker being terminated by fpm after %request_terminate_timeout% of execution time



------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=78413&edit=1


Thread (3 messages)

« previous php.bugs (#222463) next »