fat Fri, 12 Nov 2010 00:30:35 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=305287
Log: - Fixed #52660 (custom process title for FPM) Bug: http://bugs.php.net/52660 (Analyzed) change FPM processes title according to their type Changed paths: U php/php-src/branches/PHP_5_3/NEWS U php/php-src/branches/PHP_5_3/sapi/fpm/config.m4 U php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm.c U php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c U php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_env.c U php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_env.h U php/php-src/trunk/sapi/fpm/config.m4 U php/php-src/trunk/sapi/fpm/fpm/fpm.c U php/php-src/trunk/sapi/fpm/fpm/fpm_conf.c U php/php-src/trunk/sapi/fpm/fpm/fpm_env.c U php/php-src/trunk/sapi/fpm/fpm/fpm_env.h
Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/branches/PHP_5_3/NEWS 2010-11-12 00:30:35 UTC (rev 305287) @@ -14,6 +14,7 @@ (Andrey) - Improved support for is_link and related functions on Windows. (Pierre) +- Added custom process title for FPM. (fat) - Added '-t/--test' to php-fpm to check and validate FPM conf file. (fat) - Added statistics about listening socket queue length for FPM. (andrei dot nigmatulin at gmail dot com, fat) Modified: php/php-src/branches/PHP_5_3/sapi/fpm/config.m4 =================================================================== --- php/php-src/branches/PHP_5_3/sapi/fpm/config.m4 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/branches/PHP_5_3/sapi/fpm/config.m4 2010-11-12 00:30:35 UTC (rev 305287) @@ -219,7 +219,7 @@ dnl configure checks {{{ AC_DEFUN([AC_FPM_STDLIBS], [ - AC_CHECK_FUNCS(setenv clearenv) + AC_CHECK_FUNCS(setenv clearenv setproctitle) AC_SEARCH_LIBS(socket, socket) AC_SEARCH_LIBS(inet_addr, nsl) Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm.c =================================================================== --- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm.c 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm.c 2010-11-12 00:30:35 UTC (rev 305287) @@ -33,9 +33,9 @@ 0 > fpm_stdio_init_main() || 0 > fpm_conf_init_main() || 0 > fpm_unix_init_main() || + 0 > fpm_pctl_init_main() || 0 > fpm_env_init_main() || 0 > fpm_signals_init_main() || - 0 > fpm_pctl_init_main() || 0 > fpm_children_init_main() || 0 > fpm_sockets_init_main() || 0 > fpm_worker_pool_init_main() || Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c =================================================================== --- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_conf.c 2010-11-12 00:30:35 UTC (rev 305287) @@ -698,6 +698,7 @@ free(fpm_global_config.error_log); fpm_global_config.pid_file = 0; fpm_global_config.error_log = 0; + efree(fpm_globals.config); } /* }}} */ @@ -1010,38 +1011,34 @@ int fpm_conf_init_main() /* {{{ */ { - char *filename = fpm_globals.config; - int free = 0; int ret; TSRMLS_FETCH(); - if (filename == NULL) { - spprintf(&filename, 0, "%s/php-fpm.conf", PHP_SYSCONFDIR); - free = 1; + if (fpm_globals.config == NULL) { + spprintf(&fpm_globals.config, 0, "%s/php-fpm.conf", PHP_SYSCONFDIR); + if (!fpm_globals.config) { + zlog(ZLOG_SYSERROR, "spprintf() failed (\"%s/php-fpm.conf\")", PHP_SYSCONFDIR); + return -1; + } } - ret = fpm_conf_load_ini_file(filename TSRMLS_CC); + ret = fpm_conf_load_ini_file(fpm_globals.config TSRMLS_CC); if (0 > ret) { - zlog(ZLOG_ERROR, "failed to load configuration file '%s'", filename); - if (free) efree(filename); + zlog(ZLOG_ERROR, "failed to load configuration file '%s'", fpm_globals.config); return -1; } if (0 > fpm_conf_post_process()) { zlog(ZLOG_ERROR, "failed to post process the configuration"); - if (free) efree(filename); return -1; } if (fpm_globals.test_conf) { - zlog(ZLOG_NOTICE, "configuration file %s test is successful\n", filename); - if (free) efree(filename); + zlog(ZLOG_NOTICE, "configuration file %s test is successful\n", fpm_globals.config); return -1; } - if (free) efree(filename); - if (0 > fpm_cleanup_add(FPM_CLEANUP_ALL, fpm_conf_cleanup, 0)) { return -1; } Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_env.c =================================================================== --- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_env.c 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_env.c 2010-11-12 00:30:35 UTC (rev 305287) @@ -12,8 +12,16 @@ #include <string.h> #include "fpm_env.h" +#include "fpm.h" #include "zlog.h" +#ifndef HAVE_SETPROCTITLE +#ifdef __linux__ +static char **fpm_env_argv = NULL; +static size_t fpm_env_argv_len = 0; +#endif +#endif + #ifndef HAVE_SETENV # ifdef (__sparc__ || __sparc) int setenv(char *name, char *value, int clobber) /* {{{ */ @@ -111,9 +119,30 @@ /* }}} */ #endif +void fpm_env_setproctitle(char *title) /* {{{ */ +{ +#ifdef HAVE_SETPROCTITLE + setproctitle("%s", title); +#else +#ifdef __linux__ + if (fpm_env_argv != NULL && fpm_env_argv_len > strlen(SETPROCTITLE_PREFIX) + 3) { + memset(fpm_env_argv[0], 0, fpm_env_argv_len); + strncpy(fpm_env_argv[0], SETPROCTITLE_PREFIX, fpm_env_argv_len - 2); + strncpy(fpm_env_argv[0] + strlen(SETPROCTITLE_PREFIX), title, fpm_env_argv_len - strlen(SETPROCTITLE_PREFIX) - 2); + fpm_env_argv[1] = NULL; + } +#endif +#endif +} +/* }}} */ + int fpm_env_init_child(struct fpm_worker_pool_s *wp) /* {{{ */ { struct key_value_s *kv; + char *title; + spprintf(&title, 0, "pool %s", wp->config->name); + fpm_env_setproctitle(title); + efree(title); clearenv(); @@ -169,12 +198,79 @@ int fpm_env_init_main() /* {{{ */ { struct fpm_worker_pool_s *wp; + int i; + char *first = NULL; + char *last = NULL; + char *title; for (wp = fpm_worker_all_pools; wp; wp = wp->next) { if (0 > fpm_env_conf_wp(wp)) { return -1; } } +#ifndef HAVE_SETPROCTITLE +#ifdef __linux__ + /* + * This piece of code has been inspirated from nginx and pureftpd code, whic + * are under BSD licence. + * + * To change the process title in Linux we have to set argv[1] to NULL + * and to copy the title to the same place where the argv[0] points to. + * However, argv[0] may be too small to hold a new title. Fortunately, Linux + * store argv[] and environ[] one after another. So we should ensure that is + * the continuous memory and then we allocate the new memory for environ[] + * and copy it. After this we could use the memory starting from argv[0] for + * our process title. + */ + + for (i = 0; i < fpm_globals.argc; i++) { + if (first == NULL) { + first = fpm_globals.argv[i]; + } + if (last == NULL || fpm_globals.argv[i] == last + 1) { + last = fpm_globals.argv[i] + strlen(fpm_globals.argv[i]); + } + } + if (environ) { + for (i = 0; environ[i]; i++) { + if (first == NULL) { + first = environ[i]; + } + if (last == NULL || environ[i] == last + 1) { + last = environ[i] + strlen(environ[i]); + } + } + } + if (first == NULL || last == NULL) { + return 0; + } + + fpm_env_argv_len = last - first; + fpm_env_argv = fpm_globals.argv; + if (environ != NULL) { + char **new_environ; + unsigned int env_nb = 0U; + + while (environ[env_nb]) { + env_nb++; + } + + if ((new_environ = malloc((1U + env_nb) * sizeof (char *))) == NULL) { + return -1; + } + new_environ[env_nb] = NULL; + while (env_nb > 0U) { + env_nb--; + new_environ[env_nb] = strdup(environ[env_nb]); + } + environ = new_environ; + } +#endif +#endif + + spprintf(&title, 0, "master process (%s)", fpm_globals.config); + fpm_env_setproctitle(title); + efree(title); return 0; } /* }}} */ Modified: php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_env.h =================================================================== --- php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_env.h 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/branches/PHP_5_3/sapi/fpm/fpm/fpm_env.h 2010-11-12 00:30:35 UTC (rev 305287) @@ -7,8 +7,11 @@ #include "fpm_worker_pool.h" +#define SETPROCTITLE_PREFIX "php-fpm: " + int fpm_env_init_child(struct fpm_worker_pool_s *wp); int fpm_env_init_main(); +void fpm_env_setproctitle(char *title); extern char **environ; Modified: php/php-src/trunk/sapi/fpm/config.m4 =================================================================== --- php/php-src/trunk/sapi/fpm/config.m4 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/trunk/sapi/fpm/config.m4 2010-11-12 00:30:35 UTC (rev 305287) @@ -219,7 +219,7 @@ dnl configure checks {{{ AC_DEFUN([AC_FPM_STDLIBS], [ - AC_CHECK_FUNCS(setenv clearenv) + AC_CHECK_FUNCS(setenv clearenv setproctitle) AC_SEARCH_LIBS(socket, socket) AC_SEARCH_LIBS(inet_addr, nsl) Modified: php/php-src/trunk/sapi/fpm/fpm/fpm.c =================================================================== --- php/php-src/trunk/sapi/fpm/fpm/fpm.c 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/trunk/sapi/fpm/fpm/fpm.c 2010-11-12 00:30:35 UTC (rev 305287) @@ -33,9 +33,9 @@ 0 > fpm_stdio_init_main() || 0 > fpm_conf_init_main() || 0 > fpm_unix_init_main() || + 0 > fpm_pctl_init_main() || 0 > fpm_env_init_main() || 0 > fpm_signals_init_main() || - 0 > fpm_pctl_init_main() || 0 > fpm_children_init_main() || 0 > fpm_sockets_init_main() || 0 > fpm_worker_pool_init_main() || Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_conf.c =================================================================== --- php/php-src/trunk/sapi/fpm/fpm/fpm_conf.c 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/trunk/sapi/fpm/fpm/fpm_conf.c 2010-11-12 00:30:35 UTC (rev 305287) @@ -698,6 +698,7 @@ free(fpm_global_config.error_log); fpm_global_config.pid_file = 0; fpm_global_config.error_log = 0; + efree(fpm_globals.config); } /* }}} */ @@ -1010,38 +1011,34 @@ int fpm_conf_init_main() /* {{{ */ { - char *filename = fpm_globals.config; - int free = 0; int ret; TSRMLS_FETCH(); - if (filename == NULL) { - spprintf(&filename, 0, "%s/php-fpm.conf", PHP_SYSCONFDIR); - free = 1; + if (fpm_globals.config == NULL) { + spprintf(&fpm_globals.config, 0, "%s/php-fpm.conf", PHP_SYSCONFDIR); + if (!fpm_globals.config) { + zlog(ZLOG_SYSERROR, "spprintf() failed (\"%s/php-fpm.conf\")", PHP_SYSCONFDIR); + return -1; + } } - ret = fpm_conf_load_ini_file(filename TSRMLS_CC); + ret = fpm_conf_load_ini_file(fpm_globals.config TSRMLS_CC); if (0 > ret) { - zlog(ZLOG_ERROR, "failed to load configuration file '%s'", filename); - if (free) efree(filename); + zlog(ZLOG_ERROR, "failed to load configuration file '%s'", fpm_globals.config); return -1; } if (0 > fpm_conf_post_process()) { zlog(ZLOG_ERROR, "failed to post process the configuration"); - if (free) efree(filename); return -1; } if (fpm_globals.test_conf) { - zlog(ZLOG_NOTICE, "configuration file %s test is successful\n", filename); - if (free) efree(filename); + zlog(ZLOG_NOTICE, "configuration file %s test is successful\n", fpm_globals.config); return -1; } - if (free) efree(filename); - if (0 > fpm_cleanup_add(FPM_CLEANUP_ALL, fpm_conf_cleanup, 0)) { return -1; } Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_env.c =================================================================== --- php/php-src/trunk/sapi/fpm/fpm/fpm_env.c 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/trunk/sapi/fpm/fpm/fpm_env.c 2010-11-12 00:30:35 UTC (rev 305287) @@ -12,8 +12,16 @@ #include <string.h> #include "fpm_env.h" +#include "fpm.h" #include "zlog.h" +#ifndef HAVE_SETPROCTITLE +#ifdef __linux__ +static char **fpm_env_argv = NULL; +static size_t fpm_env_argv_len = 0; +#endif +#endif + #ifndef HAVE_SETENV # ifdef (__sparc__ || __sparc) int setenv(char *name, char *value, int clobber) /* {{{ */ @@ -111,9 +119,30 @@ /* }}} */ #endif +void fpm_env_setproctitle(char *title) /* {{{ */ +{ +#ifdef HAVE_SETPROCTITLE + setproctitle("%s", title); +#else +#ifdef __linux__ + if (fpm_env_argv != NULL && fpm_env_argv_len > strlen(SETPROCTITLE_PREFIX) + 3) { + memset(fpm_env_argv[0], 0, fpm_env_argv_len); + strncpy(fpm_env_argv[0], SETPROCTITLE_PREFIX, fpm_env_argv_len - 2); + strncpy(fpm_env_argv[0] + strlen(SETPROCTITLE_PREFIX), title, fpm_env_argv_len - strlen(SETPROCTITLE_PREFIX) - 2); + fpm_env_argv[1] = NULL; + } +#endif +#endif +} +/* }}} */ + int fpm_env_init_child(struct fpm_worker_pool_s *wp) /* {{{ */ { struct key_value_s *kv; + char *title; + spprintf(&title, 0, "pool %s", wp->config->name); + fpm_env_setproctitle(title); + efree(title); clearenv(); @@ -169,12 +198,79 @@ int fpm_env_init_main() /* {{{ */ { struct fpm_worker_pool_s *wp; + int i; + char *first = NULL; + char *last = NULL; + char *title; for (wp = fpm_worker_all_pools; wp; wp = wp->next) { if (0 > fpm_env_conf_wp(wp)) { return -1; } } +#ifndef HAVE_SETPROCTITLE +#ifdef __linux__ + /* + * This piece of code has been inspirated from nginx and pureftpd code, whic + * are under BSD licence. + * + * To change the process title in Linux we have to set argv[1] to NULL + * and to copy the title to the same place where the argv[0] points to. + * However, argv[0] may be too small to hold a new title. Fortunately, Linux + * store argv[] and environ[] one after another. So we should ensure that is + * the continuous memory and then we allocate the new memory for environ[] + * and copy it. After this we could use the memory starting from argv[0] for + * our process title. + */ + + for (i = 0; i < fpm_globals.argc; i++) { + if (first == NULL) { + first = fpm_globals.argv[i]; + } + if (last == NULL || fpm_globals.argv[i] == last + 1) { + last = fpm_globals.argv[i] + strlen(fpm_globals.argv[i]); + } + } + if (environ) { + for (i = 0; environ[i]; i++) { + if (first == NULL) { + first = environ[i]; + } + if (last == NULL || environ[i] == last + 1) { + last = environ[i] + strlen(environ[i]); + } + } + } + if (first == NULL || last == NULL) { + return 0; + } + + fpm_env_argv_len = last - first; + fpm_env_argv = fpm_globals.argv; + if (environ != NULL) { + char **new_environ; + unsigned int env_nb = 0U; + + while (environ[env_nb]) { + env_nb++; + } + + if ((new_environ = malloc((1U + env_nb) * sizeof (char *))) == NULL) { + return -1; + } + new_environ[env_nb] = NULL; + while (env_nb > 0U) { + env_nb--; + new_environ[env_nb] = strdup(environ[env_nb]); + } + environ = new_environ; + } +#endif +#endif + + spprintf(&title, 0, "master process (%s)", fpm_globals.config); + fpm_env_setproctitle(title); + efree(title); return 0; } /* }}} */ Modified: php/php-src/trunk/sapi/fpm/fpm/fpm_env.h =================================================================== --- php/php-src/trunk/sapi/fpm/fpm/fpm_env.h 2010-11-11 23:42:39 UTC (rev 305286) +++ php/php-src/trunk/sapi/fpm/fpm/fpm_env.h 2010-11-12 00:30:35 UTC (rev 305287) @@ -7,8 +7,11 @@ #include "fpm_worker_pool.h" +#define SETPROCTITLE_PREFIX "php-fpm: " + int fpm_env_init_child(struct fpm_worker_pool_s *wp); int fpm_env_init_main(); +void fpm_env_setproctitle(char *title); extern char **environ;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php