diff options
-rw-r--r-- | sapi/fpm/fpm/fpm_conf.c | 45 | ||||
-rw-r--r-- | sapi/fpm/fpm/fpm_conf.h | 3 | ||||
-rw-r--r-- | sapi/fpm/fpm/fpm_php.c | 88 | ||||
-rw-r--r-- | sapi/fpm/fpm/fpm_php.h | 2 | ||||
-rw-r--r-- | sapi/fpm/php-fpm.conf.in | 16 |
5 files changed, 107 insertions, 47 deletions
diff --git a/sapi/fpm/fpm/fpm_conf.c b/sapi/fpm/fpm/fpm_conf.c index 0d0832904a..fe685bea11 100644 --- a/sapi/fpm/fpm/fpm_conf.c +++ b/sapi/fpm/fpm/fpm_conf.c @@ -239,12 +239,27 @@ static char *xml_conf_set_slot_key_value_pair(void **conf, char *name, void *vv, return "xml_conf_set_slot_key_value_pair(): strdup() failed"; } + kv->next = **parent; **parent = kv; - *parent = &kv->next; return NULL; } /* }}} */ +static char *xml_conf_set_slot_key_value_pair_bool(void **conf, char *name, void *vv, intptr_t offset) /* {{{ */ +{ + int value; + void *subconf = &value; + char *error; + + error = xml_conf_set_slot_boolean(&subconf, name, vv, 0); + if (error) { + return error; + } + + return(xml_conf_set_slot_key_value_pair(conf, name, value ? "On" : "Off", offset)); +} +/* }}} */ + static struct xml_conf_section fpm_conf_set_key_value_pairs_subsection_conf = { .path = "key_value_pairs somewhere", /* fixme */ .parsers = (struct xml_value_parser []) { @@ -253,6 +268,14 @@ static struct xml_conf_section fpm_conf_set_key_value_pairs_subsection_conf = { } }; +static struct xml_conf_section fpm_conf_set_key_value_pairs_subsection_conf_bool = { + .path = "key_value_pairs somewhere", /* fixme */ + .parsers = (struct xml_value_parser []) { + { XML_CONF_SCALAR, 0, &xml_conf_set_slot_key_value_pair_bool, 0 }, + { 0, 0, 0, 0 } + } +}; + static char *fpm_conf_set_key_value_pairs_subsection(void **conf, char *name, void *xml_node, intptr_t offset) /* {{{ */ { void *next_kv = (char *) *conf + offset; @@ -260,6 +283,13 @@ static char *fpm_conf_set_key_value_pairs_subsection(void **conf, char *name, vo } /* }}} */ +static char *fpm_conf_set_key_value_pairs_subsection_bool(void **conf, char *name, void *xml_node, intptr_t offset) /* {{{ */ +{ + void *next_kv = (char *) *conf + offset; + return xml_conf_parse_section(&next_kv, &fpm_conf_set_key_value_pairs_subsection_conf_bool, xml_node); +} +/* }}} */ + static void *fpm_worker_pool_config_alloc() /* {{{ */ { static struct fpm_worker_pool_s *current_wp = 0; @@ -303,7 +333,13 @@ int fpm_worker_pool_config_free(struct fpm_worker_pool_config_s *wpc) /* {{{ */ free(wpc->listen_options->mode); free(wpc->listen_options); } - for (kv = wpc->php_defines; kv; kv = kv_next) { + for (kv = wpc->php_values; kv; kv = kv_next) { + kv_next = kv->next; + free(kv->key); + free(kv->value); + free(kv); + } + for (kv = wpc->php_admin_values; kv; kv = kv_next) { kv_next = kv->next; free(kv->key); free(kv->value); @@ -334,7 +370,10 @@ static struct xml_conf_section xml_section_fpm_worker_pool_config = { { XML_CONF_SCALAR, "name", &xml_conf_set_slot_string, offsetof(struct fpm_worker_pool_config_s, name) }, { XML_CONF_SCALAR, "listen_address", &xml_conf_set_slot_string, offsetof(struct fpm_worker_pool_config_s, listen_address) }, { XML_CONF_SUBSECTION, "listen_options", &fpm_conf_set_listen_options_subsection, offsetof(struct fpm_worker_pool_config_s, listen_options) }, - { XML_CONF_SUBSECTION, "php_defines", &fpm_conf_set_key_value_pairs_subsection, offsetof(struct fpm_worker_pool_config_s, php_defines) }, + { XML_CONF_SUBSECTION, "php_value", &fpm_conf_set_key_value_pairs_subsection, offsetof(struct fpm_worker_pool_config_s, php_values) }, + { XML_CONF_SUBSECTION, "php_flag", &fpm_conf_set_key_value_pairs_subsection_bool, offsetof(struct fpm_worker_pool_config_s, php_values) }, + { XML_CONF_SUBSECTION, "php_admin_value", &fpm_conf_set_key_value_pairs_subsection, offsetof(struct fpm_worker_pool_config_s, php_admin_values) }, + { XML_CONF_SUBSECTION, "php_admin_flag", &fpm_conf_set_key_value_pairs_subsection_bool, offsetof(struct fpm_worker_pool_config_s, php_admin_values) }, { XML_CONF_SCALAR, "user", &xml_conf_set_slot_string, offsetof(struct fpm_worker_pool_config_s, user) }, { XML_CONF_SCALAR, "group", &xml_conf_set_slot_string, offsetof(struct fpm_worker_pool_config_s, group) }, { XML_CONF_SCALAR, "chroot", &xml_conf_set_slot_string, offsetof(struct fpm_worker_pool_config_s, chroot) }, diff --git a/sapi/fpm/fpm/fpm_conf.h b/sapi/fpm/fpm/fpm_conf.h index 486319a737..9ee16fd1e2 100644 --- a/sapi/fpm/fpm/fpm_conf.h +++ b/sapi/fpm/fpm/fpm_conf.h @@ -50,7 +50,8 @@ struct fpm_worker_pool_config_s { char *name; char *listen_address; struct fpm_listen_options_s *listen_options; - struct key_value_s *php_defines; + struct key_value_s *php_values; + struct key_value_s *php_admin_values; char *user; char *group; char *chroot; diff --git a/sapi/fpm/fpm/fpm_php.c b/sapi/fpm/fpm/fpm_php.c index 145146f660..5243716b65 100644 --- a/sapi/fpm/fpm/fpm_php.c +++ b/sapi/fpm/fpm/fpm_php.c @@ -20,7 +20,7 @@ #include "fpm_cleanup.h" #include "fpm_worker_pool.h" -static int zend_ini_alter_master(char *name, int name_length, char *new_value, int new_value_length, int stage TSRMLS_DC) /* {{{ */ +static int fpm_php_zend_ini_alter_master(char *name, int name_length, char *new_value, int new_value_length, int mode, int stage TSRMLS_DC) /* {{{ */ { zend_ini_entry *ini_entry; char *duplicate; @@ -32,10 +32,11 @@ static int zend_ini_alter_master(char *name, int name_length, char *new_value, i duplicate = strdup(new_value); if (!ini_entry->on_modify - || ini_entry->on_modify(ini_entry, duplicate, new_value_length, - ini_entry->mh_arg1, ini_entry->mh_arg2, ini_entry->mh_arg3, stage TSRMLS_CC) == SUCCESS) { + || ini_entry->on_modify(ini_entry, duplicate, new_value_length, + ini_entry->mh_arg1, ini_entry->mh_arg2, ini_entry->mh_arg3, stage TSRMLS_CC) == SUCCESS) { ini_entry->value = duplicate; ini_entry->value_length = new_value_length; + ini_entry->modifiable = mode; } else { free(duplicate); } @@ -73,55 +74,62 @@ static void fpm_php_disable(char *value, int (*zend_disable)(char *, uint TSRMLS } /* }}} */ +int fpm_php_apply_defines_ex(struct key_value_s *kv, int mode) /* {{{ */ +{ + TSRMLS_FETCH(); + + char *name = kv->key; + char *value = kv->value; + int name_len = strlen(name); + int value_len = strlen(value); + + if (!strcmp(name, "extension") && *value) { + zval zv; + php_dl(value, MODULE_PERSISTENT, &zv, 1 TSRMLS_CC); + return Z_BVAL(zv) ? 1 : -1; + } + + if (fpm_php_zend_ini_alter_master(name, name_len+1, value, value_len, mode, PHP_INI_STAGE_ACTIVATE TSRMLS_CC) == FAILURE) { + return -1; + } + + if (!strcmp(name, "disable_functions") && *value) { + char *v = strdup(value); + PG(disable_functions) = v; + fpm_php_disable(v, zend_disable_function TSRMLS_CC); + return 1; + } + + if (!strcmp(name, "disable_classes") && *value) { + char *v = strdup(value); + PG(disable_classes) = v; + fpm_php_disable(v, zend_disable_class TSRMLS_CC); + return 1; + } + + return 1; +} +/* }}} */ + static int fpm_php_apply_defines(struct fpm_worker_pool_s *wp) /* {{{ */ { TSRMLS_FETCH(); struct key_value_s *kv; - for (kv = wp->config->php_defines; kv; kv = kv->next) { - char *name = kv->key; - char *value = kv->value; - int name_len = strlen(name); - int value_len = strlen(value); - - if (!strcmp(name, "extension") && *value) { - zval zv; - -#if defined(PHP_VERSION_ID) && (PHP_VERSION_ID >= 50300) - php_dl(value, MODULE_PERSISTENT, &zv, 1 TSRMLS_CC); -#else - zval filename; - ZVAL_STRINGL(&filename, value, value_len, 0); -#if (PHP_MAJOR_VERSION >= 5) - php_dl(&filename, MODULE_PERSISTENT, &zv, 1 TSRMLS_CC); -#else - php_dl(&filename, MODULE_PERSISTENT, &zv TSRMLS_CC); -#endif -#endif - continue; + for (kv = wp->config->php_values; kv; kv = kv->next) { + if (fpm_php_apply_defines_ex(kv, ZEND_INI_USER) == -1) { + fprintf(stderr, "Unable to set php_value '%s'", kv->key); } + } - zend_ini_alter_master(name, name_len + 1, value, value_len, PHP_INI_STAGE_ACTIVATE TSRMLS_CC); - - if (!strcmp(name, "disable_functions") && *value) { - char *v = strdup(value); -#if (PHP_MAJOR_VERSION >= 5) - PG(disable_functions) = v; -#endif - fpm_php_disable(v, zend_disable_function TSRMLS_CC); - } - else if (!strcmp(name, "disable_classes") && *value) { - char *v = strdup(value); -#if (PHP_MAJOR_VERSION >= 5) - PG(disable_classes) = v; -#endif - fpm_php_disable(v, zend_disable_class TSRMLS_CC); + for (kv = wp->config->php_admin_values; kv; kv = kv->next) { + if (fpm_php_apply_defines_ex(kv, ZEND_INI_SYSTEM) == -1) { + fprintf(stderr, "Unable to set php_admin_value '%s'", kv->key); } } return 0; } -/* }}} */ static int fpm_php_set_allowed_clients(struct fpm_worker_pool_s *wp) /* {{{ */ { diff --git a/sapi/fpm/fpm/fpm_php.h b/sapi/fpm/fpm/fpm_php.h index 3db1036598..8c4b58ceb6 100644 --- a/sapi/fpm/fpm/fpm_php.h +++ b/sapi/fpm/fpm/fpm_php.h @@ -9,6 +9,7 @@ #include "php.h" #include "build-defs.h" /* for PHP_ defines */ +#include "fpm/fpm_conf.h" struct fpm_worker_pool_s; @@ -18,6 +19,7 @@ char *fpm_php_request_method(TSRMLS_D); size_t fpm_php_content_length(TSRMLS_D); void fpm_php_soft_quit(); int fpm_php_init_main(); +int fpm_php_apply_defines_ex(struct key_value_s *kv, int mode); #endif diff --git a/sapi/fpm/php-fpm.conf.in b/sapi/fpm/php-fpm.conf.in index f73d71bdd9..ca9032754a 100644 --- a/sapi/fpm/php-fpm.conf.in +++ b/sapi/fpm/php-fpm.conf.in @@ -55,11 +55,21 @@ Additional php.ini defines, specific to this pool of workers. These settings overwrite the values previously defined in the php.ini. - <value name="php_defines"> + Like apache, you can use php_value, php_flag, php_admin_value or php_admin_flag. + Defining 'extension' will search for the corresponding shared extension in extension_dir. + Defining 'disable_functions' or 'disable_classes' won't overwrite previously defined + php.ini value, but the new value will be append. + <value name="php_value"> + <!-- <value name="error_log">/var/log/php-error.log</value> --> + </value> + <value name="php_flag"> + <!-- <value name="log_errors">true</value> --> + </value> + <value name="php_admin_value"> <!-- <value name="sendmail_path">/usr/sbin/sendmail -t -i</value> --> + </value> + <value name="php_admin_flag"> <!-- <value name="display_errors">0</value> --> - <!-- <value name="error_log">/var/log/php-error.log</value> --> - <!-- <value name="log_errors">true</value> --> </value> Unix user of processes |