diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 9526a04c4187c..2a53db9524e4f 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -150,6 +150,7 @@ typedef struct _php_cgi_globals_struct { bool discard_path; bool fcgi_logging; bool fcgi_logging_request_started; + bool fcgi_auto_close_conn; char *redirect_status_env; HashTable user_config_cache; char *error_header; @@ -1431,6 +1432,7 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("cgi.fix_pathinfo", "1", PHP_INI_SYSTEM, OnUpdateBool, fix_pathinfo, php_cgi_globals_struct, php_cgi_globals) STD_PHP_INI_BOOLEAN("cgi.discard_path", "0", PHP_INI_SYSTEM, OnUpdateBool, discard_path, php_cgi_globals_struct, php_cgi_globals) STD_PHP_INI_BOOLEAN("fastcgi.logging", "1", PHP_INI_SYSTEM, OnUpdateBool, fcgi_logging, php_cgi_globals_struct, php_cgi_globals) + STD_PHP_INI_BOOLEAN("fastcgi.auto_close_connection", "1", PHP_INI_SYSTEM, OnUpdateBool, fcgi_auto_close_conn, php_cgi_globals_struct, php_cgi_globals) STD_PHP_INI_ENTRY("fastcgi.error_header", NULL, PHP_INI_SYSTEM, OnUpdateString, error_header, php_cgi_globals_struct, php_cgi_globals) STD_PHP_INI_ENTRY("fpm.config", NULL, PHP_INI_SYSTEM, OnUpdateString, fpm_config, php_cgi_globals_struct, php_cgi_globals) PHP_INI_END() @@ -1446,6 +1448,7 @@ static void php_cgi_globals_ctor(php_cgi_globals_struct *php_cgi_globals) php_cgi_globals->discard_path = 0; php_cgi_globals->fcgi_logging = 1; php_cgi_globals->fcgi_logging_request_started = false; + php_cgi_globals->fcgi_auto_close_conn = true; zend_hash_init(&php_cgi_globals->user_config_cache, 0, NULL, user_config_cache_entry_dtor, 1); php_cgi_globals->error_header = NULL; php_cgi_globals->fpm_config = NULL; @@ -1488,18 +1491,23 @@ static PHP_MINFO_FUNCTION(cgi) PHP_FUNCTION(fastcgi_finish_request) /* {{{ */ { + bool close_conn = CGIG(fcgi_auto_close_conn); fcgi_request *request = (fcgi_request*) SG(server_context); - if (zend_parse_parameters_none() == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(0, 1) + Z_PARAM_OPTIONAL + Z_PARAM_BOOL(close_conn) + ZEND_PARSE_PARAMETERS_END(); if (!fcgi_is_closed(request)) { php_output_end_all(); php_header(); + if (close_conn) { + fcgi_request_set_keep(request, 0); + } fcgi_end(request); - fcgi_close(request, 0, 0); + fcgi_close(request, 0, close_conn); RETURN_TRUE; } diff --git a/sapi/fpm/fpm/fpm_main.stub.php b/sapi/fpm/fpm/fpm_main.stub.php index 70cd275223915..c88d78e3f1264 100644 --- a/sapi/fpm/fpm/fpm_main.stub.php +++ b/sapi/fpm/fpm/fpm_main.stub.php @@ -2,7 +2,7 @@ /** @generate-class-entries */ -function fastcgi_finish_request(): bool {} +function fastcgi_finish_request(bool $close_conn = true): bool {} function apache_request_headers(): array {} diff --git a/sapi/fpm/fpm/fpm_main_arginfo.h b/sapi/fpm/fpm/fpm_main_arginfo.h index 2d6ae3cc79334..29951bec76f61 100644 --- a/sapi/fpm/fpm/fpm_main_arginfo.h +++ b/sapi/fpm/fpm/fpm_main_arginfo.h @@ -1,7 +1,8 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: b4ac4c0f1d91c354293e21185a2e6d9f99cc9fcc */ + * Stub hash: 1d83ef8a559cd2203d67c77ea647c1da72521d0d */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_fastcgi_finish_request, 0, 0, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, close_conn, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_apache_request_headers, 0, 0, IS_ARRAY, 0)