Browse Source

- Fixed #52660 (custom process title for FPM)

pull/12/head
Jérôme Loyet 16 years ago
parent
commit
c28f44e409
  1. 1
      NEWS
  2. 2
      sapi/fpm/config.m4
  3. 2
      sapi/fpm/fpm/fpm.c
  4. 23
      sapi/fpm/fpm/fpm_conf.c
  5. 96
      sapi/fpm/fpm/fpm_env.c
  6. 3
      sapi/fpm/fpm/fpm_env.h

1
NEWS

@ -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)

2
sapi/fpm/config.m4

@ -219,7 +219,7 @@ dnl }}}
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)

2
sapi/fpm/fpm/fpm.c

@ -33,9 +33,9 @@ int fpm_init(int argc, char **argv, char *config, struct event_base **base) /* {
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() ||

23
sapi/fpm/fpm/fpm_conf.c

@ -698,6 +698,7 @@ static void fpm_conf_cleanup(int which, void *arg) /* {{{ */
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_load_ini_file(char *filename TSRMLS_DC) /* {{{ */
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;
}

96
sapi/fpm/fpm/fpm_env.c

@ -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 @@ static char * nvmatch(char *s1, char *s2) /* {{{ */
/* }}} */
#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 @@ static int fpm_env_conf_wp(struct fpm_worker_pool_s *wp) /* {{{ */
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;
}
/* }}} */

3
sapi/fpm/fpm/fpm_env.h

@ -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;

Loading…
Cancel
Save