Req #78413 [Opn->Csd]: request_terminate_timeout does not take effect after fastcgi_finish_request

From: Date: Mon, 30 Sep 2019 10:55:14 +0000
Subject: Req #78413 [Opn->Csd]: 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-222958@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
 Updated by:         nikic@php.net
 Reported by:        rs dot orlov at gmail dot com
 Summary:            request_terminate_timeout does not take effect after
                     fastcgi_finish_request
-Status:             Open
+Status:             Closed
 Type:               Feature/Change Request
 Package:            FPM related
 PHP Version:        Irrelevant
 Block user comment: N
 Private report:     N

 New Comment:

Automatic comment on behalf of turchanov@farpost.com
Revision: http://git.php.net/?p=php-src.git;a=commit;h=e546d721e8c61fb1218335dc75b1874033c3ca24
Log: Fix #78413: php-fpm request_terminate_timeout does not take effect after fastcgi_finish_request


Previous Comments:
------------------------------------------------------------------------
[2019-08-28 04:56:38] turchanov at farpost dot com

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

------------------------------------------------------------------------
[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 (#222958) next »