pid_t pid;
struct fpm_child_s *child;
int max;
+ static int warned = 0;
if (wp->config->pm == PM_STYLE_DYNAMIC) {
if (!in_event_loop) { /* starting */
max = wp->config->pm_max_children;
}
- while (fpm_pctl_can_spawn_children() && wp->running_children < max) {
+ /*
+ * fork children while:
+ * - fpm_pctl_can_spawn_children : FPM is running in a NORMAL state (aka not restart, stop or reload)
+ * - wp->running_children < max : there is less than the max process for the current pool
+ * - (fpm_global_config.process_max < 1 || fpm_globals.running_children < fpm_global_config.process_max):
+ * if fpm_global_config.process_max is set, FPM has not fork this number of processes (globaly)
+ */
+ while (fpm_pctl_can_spawn_children() && wp->running_children < max && (fpm_global_config.process_max < 1 || fpm_globals.running_children < fpm_global_config.process_max)) {
+
+ warned = 0;
child = fpm_resources_prepare(wp);
if (!child) {
}
+ if (!warned && fpm_global_config.process_max > 0 && fpm_globals.running_children >= fpm_global_config.process_max) {
+ warned = 1;
+ zlog(ZLOG_WARNING, "The maximum number of processes has been reached. Please review your configuration and consider raising 'process.max'");
+ }
+
return 1; /* we are done */
}
/* }}} */
struct fpm_global_config_s fpm_global_config = {
.daemonize = 1,
#ifdef HAVE_SYSLOG_H
- .syslog_facility = -1
+ .syslog_facility = -1,
#endif
+ .process_max = 0,
};
static struct fpm_worker_pool_s *current_wp = NULL;
static int ini_recursion = 0;
{ "emergency_restart_threshold", &fpm_conf_set_integer, GO(emergency_restart_threshold) },
{ "emergency_restart_interval", &fpm_conf_set_time, GO(emergency_restart_interval) },
{ "process_control_timeout", &fpm_conf_set_time, GO(process_control_timeout) },
+ { "process.max", &fpm_conf_set_integer, GO(process_max) },
{ "daemonize", &fpm_conf_set_boolean, GO(daemonize) },
{ "pid", &fpm_conf_set_string, GO(pid_file) },
{ "error_log", &fpm_conf_set_string, GO(error_log) },
fpm_globals.log_level = fpm_global_config.log_level;
+ if (fpm_global_config.process_max < 0) {
+ zlog(ZLOG_ERROR, "process_max can't be negative");
+ return -1;
+ }
+
if (!fpm_global_config.error_log) {
fpm_global_config.error_log = strdup("log/php-fpm.log");
}
zlog(ZLOG_NOTICE, "\tsyslog.facility = %d", fpm_global_config.syslog_facility); /* FIXME: convert to string */
#endif
zlog(ZLOG_NOTICE, "\tprocess_control_timeout = %ds", fpm_global_config.process_control_timeout);
+ zlog(ZLOG_NOTICE, "\tprocess.max = %d", fpm_global_config.process_max);
zlog(ZLOG_NOTICE, "\temergency_restart_interval = %ds", fpm_global_config.emergency_restart_interval);
zlog(ZLOG_NOTICE, "\temergency_restart_threshold = %d", fpm_global_config.emergency_restart_threshold);
zlog(ZLOG_NOTICE, "\trlimit_files = %d", fpm_global_config.rlimit_files);