2013-05-17

Hi,

I plan to allow php-fpm to be aware of systemd and so, use the

type=notify mode.

I'd like to apply to attached patch to 5.4 and 5.5, as this change have

no impact on standard build (need new --with-fpm-systemd build option).

Any feedback before I process ?

Remi.

diff -up ../sapi/fpm/config.m4.systemd ../sapi/fpm/config.m4

--- ../sapi/fpm/config.m4.systemd 2013-05-08 18:45:31.000000000 +0200

+++ ../sapi/fpm/config.m4 2013-05-17 12:20:19.199841304 +0200

@@ -563,6 +563,26 @@ if test "$PHP_FPM" != "no"; then

[ --with-fpm-group[=GRP] Set the group for php-fpm to run as. For a system user, this

should usually be set to match the fpm username (default: nobody)], nobody, no)

+ PHP_ARG_WITH(fpm-systemd,,

+ [ --with-fpm-systemd Activate systemd integration], no, no)

+

+ if test "$PHP_FPM_SYSTEMD" != "no" ; then

+ AC_CHECK_LIB(systemd-daemon, sd_notify, SYSTEMD_LIBS="-lsystemd-daemon")

+ AC_CHECK_HEADERS(systemd/sd-daemon.h, [HAVE_SD_DAEMON_H="yes"], [HAVE_SD_DAEMON_H="no"])

+ if test $HAVE_SD_DAEMON_H = "no" || test -z "${SYSTEMD_LIBS}"; then

+ AC_MSG_ERROR([Your system does not support systemd.])

+ else

+ AC_DEFINE(HAVE_SYSTEMD, 1, [FPM use systemd integration])

+ PHP_FPM_SD_FILES="fpm/fpm_systemd.c"

+ PHP_ADD_LIBRARY(systemd-daemon)

+ php_fpm_systemd=notify

+ fi

+ else

+ php_fpm_systemd=simple

+ fi

+ PHP_SUBST_OLD(php_fpm_systemd)

+ AC_DEFINE_UNQUOTED(PHP_FPM_SYSTEMD, "$php_fpm_systemd", [fpm systemd service type])

+

if test -z "$PHP_FPM_USER" -o "$PHP_FPM_USER" = "yes" -o "$PHP_FPM_USER" = "no"; then

php_fpm_user="nobody"

else

@@ -631,7 +651,7 @@ if test "$PHP_FPM" != "no"; then

fpm/events/port.c \

"

- PHP_SELECT_SAPI(fpm, program, $PHP_FPM_FILES $PHP_FPM_TRACE_FILES, $PHP_FPM_CFLAGS, '$(SAPI_FPM_PATH)')

+ PHP_SELECT_SAPI(fpm, program, $PHP_FPM_FILES $PHP_FPM_TRACE_FILES $PHP_FPM_SD_FILES, $PHP_FPM_CFLAGS, '$(SAPI_FPM_PATH)')

case $host_alias in

*aix*)

diff -up ../sapi/fpm/fpm/fpm_events.c.systemd ../sapi/fpm/fpm/fpm_events.c

--- ../sapi/fpm/fpm/fpm_events.c.systemd 2013-05-08 18:45:31.000000000 +0200

+++ ../sapi/fpm/fpm/fpm_events.c 2013-05-17 13:13:10.854896820 +0200

@@ -29,6 +29,10 @@

#include "events/port.h"

#include "events/kqueue.h"

+#ifdef HAVE_SYSTEMD

+#include "fpm_systemd.h"

+#endif

+

#define fpm_event_set_timeout(ev, now) timeradd(&(now), &(ev)->frequency, &(ev)->timeout);

static void fpm_event_cleanup(int which, void *arg);

@@ -361,6 +365,10 @@ void fpm_event_loop(int err) /* {{{ */

zlog(ZLOG_DEBUG, "%zu bytes have been reserved in SHM", fpm_shm_get_size_allocated());

zlog(ZLOG_NOTICE, "ready to handle connections");

+

+#ifdef HAVE_SYSTEMD

+ fpm_systemd_heartbeat(NULL, 0, NULL);

+#endif

}

while (1) {

diff -up ../sapi/fpm/fpm/fpm_systemd.c.systemd ../sapi/fpm/fpm/fpm_systemd.c

--- ../sapi/fpm/fpm/fpm_systemd.c.systemd 2013-05-17 12:20:19.200841309 +0200

+++ ../sapi/fpm/fpm/fpm_systemd.c 2013-05-17 14:18:36.851079208 +0200

@@ -0,0 +1,74 @@

+#include "fpm_config.h"

+

+#include

+#include

+

+#include "fpm.h"

+#include "fpm_clock.h"

+#include "fpm_worker_pool.h"

+#include "fpm_scoreboard.h"

+#include "zlog.h"

+#include "fpm_systemd.h"

+

+

+static void fpm_systemd() /* {{{ */

+{

+ static unsigned long int last=0;

+ struct fpm_worker_pool_s *wp;

+ unsigned long int requests=0, slow_req=0;

+ int active=0, idle=0, rv;

+

+

+ for (wp = fpm_worker_all_pools; wp; wp = wp->next) {

+ if (wp->scoreboard) {

+ active += wp->scoreboard->active;

+ idle += wp->scoreboard->idle;

+ requests += wp->scoreboard->requests;

+ slow_req += wp->scoreboard->slow_rq;

+ }

+ }

+/*

+ zlog(ZLOG_DEBUG, "systemd heartbeat (Processes active:%d, idle:%d, Requests:%lu, slow:%lu, Traffic:%.3greq/sec)",

+ active, idle, requests, slow_req, ((float)requests - last) * 1000.0 / FPM_SYSTEMD_HEARTBEAT);

+*/

+ rv = sd_notifyf(0, "READY=1\n"

+ "STATUS=Processes active: %d, idle: %d, Requests: %lu, slow: %lu, Traffic: %.3greq/sec",

+ active, idle, requests, slow_req, ((float)requests - last) * 1000.0 / FPM_SYSTEMD_HEARTBEAT);

+

+ if (rv

Show more