summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Wang <gwang@php.net>2019-07-20 23:59:43 -0400
committerGeorge Wang <gwang@php.net>2019-07-20 23:59:43 -0400
commiteb7e45f662bb8bba292caaa03f93759912bcddf0 (patch)
tree842e386960b912515e7a895004ec623aad44e696
parentc8c183eb62b666b5e9c92ca2cbf13f5464ae3aa9 (diff)
downloadphp-git-eb7e45f662bb8bba292caaa03f93759912bcddf0.tar.gz
Checked in LiteSpeed SAPI 7.5, addressed two main problems in "clean shutdown" introduced in 7.4.3,
1. falls in an infinite loop because PHP engine's inconsistent state, now override the ITIMER_PROF to 0.1 second, clean shutdown must finish before that. 2. generate too much error log, we completely disable "error_reporting" before calling php_request_shutdown().
-rw-r--r--sapi/litespeed/lsapi_main.c124
1 files changed, 62 insertions, 62 deletions
diff --git a/sapi/litespeed/lsapi_main.c b/sapi/litespeed/lsapi_main.c
index a0d464c2a5..8f02f15c32 100644
--- a/sapi/litespeed/lsapi_main.c
+++ b/sapi/litespeed/lsapi_main.c
@@ -66,6 +66,7 @@
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
+#include <sys/time.h>
#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
#include "lscriu.c"
@@ -620,7 +621,7 @@ static int sapi_lsapi_activate()
static sapi_module_struct lsapi_sapi_module =
{
"litespeed",
- "LiteSpeed V7.4.3",
+ "LiteSpeed V7.5",
php_lsapi_startup, /* startup */
php_module_shutdown_wrapper, /* shutdown */
@@ -703,66 +704,90 @@ static void lsapi_sigsegv( int signal )
static int clean_onexit = 1;
-static void lsapi_sigterm( int signal )
+
+static void lsapi_clean_shutdown()
{
- struct sigaction act, old_act;
+ struct sigaction act;
int sa_rc;
+ struct itimerval tmv;
+#if PHP_MAJOR_VERSION >= 7
+ zend_string * key;
+#endif
+ clean_onexit = 1;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ act.sa_handler = lsapi_sigsegv;
+ sa_rc = sigaction(SIGINT, &act, NULL);
+ sa_rc = sigaction(SIGQUIT, &act, NULL);
+ sa_rc = sigaction(SIGILL, &act, NULL);
+ sa_rc = sigaction(SIGABRT, &act, NULL);
+ sa_rc = sigaction(SIGBUS, &act, NULL);
+ sa_rc = sigaction(SIGSEGV, &act, NULL);
+ sa_rc = sigaction(SIGTERM, &act, NULL);
+
+ sa_rc = sigaction(SIGPROF, &act, NULL);
+ memset(&tmv, 0, sizeof(struct itimerval));
+ tmv.it_value.tv_sec = 0;
+ tmv.it_value.tv_usec = 100000;
+ setitimer(ITIMER_PROF, &tmv, NULL);
+
+#if PHP_MAJOR_VERSION >= 7
+ key = zend_string_init("error_reporting", 15, 1);
+ zend_alter_ini_entry_chars_ex(key, "0", 1,
+ PHP_INI_SYSTEM, PHP_INI_STAGE_SHUTDOWN, 1);
+ zend_string_release(key);
+#else
+ zend_alter_ini_entry("error_reporting", 16, "0", 1,
+ PHP_INI_SYSTEM, PHP_INI_STAGE_SHUTDOWN);
+#endif
+
+ zend_try {
+ php_request_shutdown(NULL);
+ } zend_end_try();
+}
+
+static void lsapi_sigterm(int signal)
+{
// fprintf(stderr, "lsapi_sigterm: %d: clean_onexit %d\n", getpid(), clean_onexit );
if(!clean_onexit)
{
- clean_onexit = 1;
- act.sa_flags = 0;
- act.sa_handler = lsapi_sigsegv;
- sa_rc = sigaction( SIGINT, &act, &old_act );
- sa_rc = sigaction( SIGQUIT, &act, &old_act );
- sa_rc = sigaction( SIGILL, &act, &old_act );
- sa_rc = sigaction( SIGABRT, &act, &old_act );
- sa_rc = sigaction( SIGBUS, &act, &old_act );
- sa_rc = sigaction( SIGSEGV, &act, &old_act );
- sa_rc = sigaction( SIGTERM, &act, &old_act );
-
- zend_try {
- php_request_shutdown(NULL);
- } zend_end_try();
+ lsapi_clean_shutdown();
}
exit(1);
}
-static void lsapi_atexit( void )
+static void lsapi_atexit(void)
{
- struct sigaction act, old_act;
- int sa_rc;
-
//fprintf(stderr, "lsapi_atexit: %d: clean_onexit %d\n", getpid(), clean_onexit );
if(!clean_onexit)
{
- clean_onexit = 1;
- act.sa_flags = 0;
- act.sa_handler = lsapi_sigsegv;
- sa_rc = sigaction( SIGINT, &act, &old_act );
- sa_rc = sigaction( SIGQUIT, &act, &old_act );
- sa_rc = sigaction( SIGILL, &act, &old_act );
- sa_rc = sigaction( SIGABRT, &act, &old_act );
- sa_rc = sigaction( SIGBUS, &act, &old_act );
- sa_rc = sigaction( SIGSEGV, &act, &old_act );
- sa_rc = sigaction( SIGTERM, &act, &old_act );
-
- //fprintf(stderr, "lsapi_atexit: %d: before php_request_shutdown\n", getpid(), clean_onexit );
- zend_try {
- php_request_shutdown(NULL);
- } zend_end_try();
+ lsapi_clean_shutdown();
}
}
+
static int lsapi_module_main(int show_source)
{
+ struct sigaction act;
+ int sa_rc;
zend_file_handle file_handle;
memset(&file_handle, 0, sizeof(file_handle));
if (php_request_startup() == FAILURE ) {
return -1;
}
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = SA_NODEFER;
+ act.sa_handler = lsapi_sigterm;
+ sa_rc = sigaction( SIGINT, &act, NULL);
+ sa_rc = sigaction( SIGQUIT, &act, NULL);
+ sa_rc = sigaction( SIGILL, &act, NULL);
+ sa_rc = sigaction( SIGABRT, &act, NULL);
+ sa_rc = sigaction( SIGBUS, &act, NULL);
+ sa_rc = sigaction( SIGSEGV, &act, NULL);
+ sa_rc = sigaction( SIGTERM, &act, NULL);
+
clean_onexit = 0;
if (show_source) {
@@ -1397,6 +1422,7 @@ void start_children( int children )
setsid();
/* Set up handler to kill children upon exit */
+ sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = litespeed_cleanup;
if( sigaction( SIGTERM, &act, &old_term ) ||
@@ -1473,15 +1499,6 @@ int main( int argc, char * argv[] )
int slow_script_msec = 0;
char time_buf[40];
- struct sigaction act, old_act;
- struct sigaction INT_act;
- struct sigaction QUIT_act;
- struct sigaction ILL_act;
- struct sigaction ABRT_act;
- struct sigaction BUS_act;
- struct sigaction SEGV_act;
- struct sigaction TERM_act;
- int sa_rc;
#ifdef HAVE_SIGNAL_H
#if defined(SIGPIPE) && defined(SIG_IGN)
@@ -1584,15 +1601,6 @@ int main( int argc, char * argv[] )
int iRequestsProcessed = 0;
int result;
- act.sa_flags = SA_NODEFER;
- act.sa_handler = lsapi_sigterm;
- sa_rc = sigaction( SIGINT, &act, &INT_act );
- sa_rc = sigaction( SIGQUIT, &act, &QUIT_act );
- sa_rc = sigaction( SIGILL, &act, &ILL_act );
- sa_rc = sigaction( SIGABRT, &act, &ABRT_act );
- sa_rc = sigaction( SIGBUS, &act, &BUS_act );
- sa_rc = sigaction( SIGSEGV, &act, &SEGV_act );
- sa_rc = sigaction( SIGTERM, &act, &TERM_act );
atexit(lsapi_atexit);
while( ( result = LSAPI_Prefork_Accept_r( &g_req )) >= 0 ) {
@@ -1625,14 +1633,6 @@ int main( int argc, char * argv[] )
}
}
- sa_rc = sigaction( SIGINT, &INT_act, &old_act );
- sa_rc = sigaction( SIGQUIT, &QUIT_act, &old_act );
- sa_rc = sigaction( SIGILL, &ILL_act, &old_act );
- sa_rc = sigaction( SIGABRT, &ABRT_act, &old_act );
- sa_rc = sigaction( SIGBUS, &BUS_act, &old_act );
- sa_rc = sigaction( SIGSEGV, &SEGV_act, &old_act );
- sa_rc = sigaction( SIGTERM, &TERM_act, &old_act );
-
php_module_shutdown();
#ifdef ZTS