mirror of
https://github.com/php/php-src.git
synced 2024-11-27 20:03:40 +08:00
Fixed bug #45423 (fastcgi parent process doesn't invoke php_module_shutdown before shutdown) (basant dot kukreja at sun dot com)
This commit is contained in:
parent
136a55fcd9
commit
c27eba9bcf
@ -101,6 +101,12 @@ static int children = 0;
|
||||
*/
|
||||
static int parent = 1;
|
||||
|
||||
/* Did parent received exit signals SIG_TERM/SIG_INT/SIG_QUIT */
|
||||
static int exit_signal = 0;
|
||||
|
||||
/* Is Parent waiting for children to exit */
|
||||
static int parent_waiting = 0;
|
||||
|
||||
/**
|
||||
* Process group
|
||||
*/
|
||||
@ -1225,6 +1231,7 @@ static void init_request_info(TSRMLS_D)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
#ifndef PHP_WIN32
|
||||
/**
|
||||
* Clean up child processes upon exit
|
||||
*/
|
||||
@ -1234,16 +1241,18 @@ void fastcgi_cleanup(int signal)
|
||||
fprintf(stderr, "FastCGI shutdown, pid %d\n", getpid());
|
||||
#endif
|
||||
|
||||
#ifndef PHP_WIN32
|
||||
sigaction(SIGTERM, &old_term, 0);
|
||||
|
||||
/* Kill all the processes in our process group */
|
||||
kill(-pgroup, SIGTERM);
|
||||
#endif
|
||||
|
||||
/* We should exit at this point, but MacOSX doesn't seem to */
|
||||
exit(0);
|
||||
if (parent && parent_waiting) {
|
||||
exit_signal = 1;
|
||||
} else {
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
PHP_INI_BEGIN()
|
||||
STD_PHP_INI_ENTRY("cgi.rfc2616_headers", "0", PHP_INI_ALL, OnUpdateBool, rfc2616_headers, php_cgi_globals_struct, php_cgi_globals)
|
||||
@ -1585,7 +1594,7 @@ consult the installation file that came with this distribution, or visit \n\
|
||||
}
|
||||
|
||||
if (fcgi_in_shutdown()) {
|
||||
exit(0);
|
||||
goto parent_out;
|
||||
}
|
||||
|
||||
while (parent) {
|
||||
@ -1622,9 +1631,25 @@ consult the installation file that came with this distribution, or visit \n\
|
||||
#ifdef DEBUG_FASTCGI
|
||||
fprintf(stderr, "Wait for kids, pid %d\n", getpid());
|
||||
#endif
|
||||
while (wait(&status) < 0) {
|
||||
parent_waiting = 1;
|
||||
while (1) {
|
||||
if (wait(&status) >= 0) {
|
||||
running--;
|
||||
break;
|
||||
} else if (exit_signal) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (exit_signal) {
|
||||
#if 0
|
||||
while (running > 0) {
|
||||
while (wait(&status) < 0) {
|
||||
}
|
||||
running--;
|
||||
}
|
||||
#endif
|
||||
goto parent_out;
|
||||
}
|
||||
running--;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -2092,6 +2117,10 @@ out:
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef PHP_WIN32
|
||||
parent_out:
|
||||
#endif
|
||||
|
||||
SG(server_context) = NULL;
|
||||
php_module_shutdown(TSRMLS_C);
|
||||
sapi_shutdown();
|
||||
|
@ -170,6 +170,20 @@ static void fcgi_signal_handler(int signo)
|
||||
}
|
||||
}
|
||||
|
||||
static void fcgi_setup_signals(void)
|
||||
{
|
||||
struct sigaction new_sa, old_sa;
|
||||
|
||||
sigemptyset(&new_sa.sa_mask);
|
||||
new_sa.sa_flags = 0;
|
||||
new_sa.sa_handler = fcgi_signal_handler;
|
||||
sigaction(SIGUSR1, &new_sa, NULL);
|
||||
sigaction(SIGTERM, &new_sa, NULL);
|
||||
sigaction(SIGPIPE, NULL, &old_sa);
|
||||
if (old_sa.sa_handler == SIG_DFL) {
|
||||
sigaction(SIGPIPE, &new_sa, NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int fcgi_in_shutdown(void)
|
||||
@ -224,18 +238,7 @@ int fcgi_init(void)
|
||||
is_initialized = 1;
|
||||
errno = 0;
|
||||
if (getpeername(0, (struct sockaddr *)&sa, &len) != 0 && errno == ENOTCONN) {
|
||||
struct sigaction new_sa, old_sa;
|
||||
|
||||
sigemptyset(&new_sa.sa_mask);
|
||||
new_sa.sa_flags = 0;
|
||||
new_sa.sa_handler = fcgi_signal_handler;
|
||||
sigaction(SIGUSR1, &new_sa, NULL);
|
||||
sigaction(SIGTERM, &new_sa, NULL);
|
||||
sigaction(SIGPIPE, NULL, &old_sa);
|
||||
if (old_sa.sa_handler == SIG_DFL) {
|
||||
sigaction(SIGPIPE, &new_sa, NULL);
|
||||
}
|
||||
|
||||
fcgi_setup_signals();
|
||||
return is_fastcgi = 1;
|
||||
} else {
|
||||
return is_fastcgi = 0;
|
||||
@ -501,6 +504,8 @@ int fcgi_listen(const char *path, int backlog)
|
||||
if (tcp) {
|
||||
listen_socket = _open_osfhandle((long)listen_socket, 0);
|
||||
}
|
||||
#else
|
||||
fcgi_setup_signals();
|
||||
#endif
|
||||
return listen_socket;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user